题目描述
给你一个二维数组,请将它排序到一个一维数组,
int* MySort(int** source, int* len,int n, int* output)
思路
将结果一维数组指针返回是一种链式编程思想,例如a = sort(a,sort(b,c))这样。然后形参给了一个指向一个指针的数组,所以这个二维数组在内存中不是连续分配的,然后还给你一个每行的长度。
- 我先想到将每一行快排,然后将每一行两两合并,就像mergesort样,但是这并没有降低算法的时间复杂度,注意这个解法的算法复杂度一般不会超过nlgn,要不然将一个一维数组切成几段就可以超过nlgn,干嘛还要快排是吧。
所以我认为这个就是一个变种的考排序算法的题目,顺便检查你的C++编程基本功。在写完后,面试官可能会问一下八种排序算法的优劣。
注意这里的output要在使用MySort函数前分配好足够的地址空间,或者使用全局变量也行。我这里给出一个使用冒泡排序的写法。当然你还可以选择其它的nlgn排序算法。注意,使用排序算法的时候一定结合具体条件来选择合适的算法,这个可以和面试官讲清楚。
#include <iostream>
using namespace std;
int res1[1000];
int* MySort(int** source, int* len,int n, int* output)
{
if(source == nullptr || *source == nullptr || len == nullptr || n < 1 || output == nullptr)
return nullptr;
int totalLen = 0;
for(int i = 0; i < n; ++i)
totalLen += len[i];
//output = new int[totalLen]; 这是错误的,把地址赋给了一个局部变量
int* res = output;
int count = 0;
for(int i = 0; i < n; ++i)
for(int j = 0; j < len[i]; ++j)
{
output[count++] = *(*(source+i)+j);
}
for(int i = 0; i < totalLen - 1; ++i)
{
for(int j = 0; j < totalLen - i - 1; ++j)
{
if(output[j] > output[j+1])
{
swap(output[j+1],output[j]);
}
}
}
return res;
}
int main()
{
int a[3] = {5,7 ,3};
int b[2] = {7,3};
int len[2] = {3,2};
int* pa = a;
int* pb = b;
int* pp[2] = {pa,pb};
//int* res1 = new int[5];
int* res2 = nullptr;
res2= MySort(pp, len, 2, res1);
for(int i = 0;i < 5;++i)
{
cout<<"res1:"<<res1[i] << "res2:"<<res2[i]<<endl;
}
return 0;
}
使用各排序算法的情形
- 插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度。
反而在这种情况下,快速排序慢了。 当n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。 - 若待排序的记录的关键字在一个明显有限范围内时,且空间允许时用桶排序。
- 当n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。
- 当n较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下宜用归并排序。
- 当n较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序。
- 快排在数组情况下,由于计算机内存访问局部性原理,会比归并在这方面更快,而在链表中,这种优势不再存在,
加上归并空间复杂度变为O(1)和快排的稳定性,所以一般在链表排序中都使用归并排序。
5552



被折叠的 条评论
为什么被折叠?



