李又在搜答案了呀,不过这个题目描述是有点不直接。
题目 分析题目的意思是这个叫arr的数组像这样储存了这n个数组:
根据这题前面的题目,这里应该是要用前面弄好的堆排序来做的。
但是因为堆排序代码量太多其实就是懒得改,于是我研究了一下,发现希尔排序也可以通过测试
如下
#include#include void shell_sort(int *array, int N) { if (!array) { return; } for (int D = N / 2; D >= 1; D /= 2) { for (int i = D; i < N; i++) { int tmp = array[i]; int j = i - D; for (; j >= 0; j -= D) { if (array[j] > tmp) { array[j + D] = array[j]; } else { break; } } array[j + D] = tmp; } } } void merge_arrays(const int *arr, int row, int col, int* output){ int size = row*col; for(int i = 0; i output[i] = arr[i]; } shell_sort(output, size); }
当然你也可以用sedgewick增量序列1来优化一下
#include#include void shell_v2(int *array, int N) { static int sedgewick[10] = {1, 5, 19, 41, 109, 505, 2161, 8929, 36289, 146305}; //sedgewick增量序列 int i, k, D, tmp; for (i = 9; i >= 0; i--) { if (sedgewick[i] < N) { D = sedgewick[i]; break; } } for (; i >= 0; i--, D = sedgewick[i]) { for (int j = D; j < N; j++) { tmp = array[j]; for (k = j - D; k >= 0; k -= D) { if (array[k] > tmp) { array[k + D] = array[k]; } else { break; } } array[k + D] = tmp; } } } void merge_arrays(const int *arr, int row, int col, int* output){ int size = row*col; for(int i = 0; i output[i] = arr[i]; } shell_v2(output, size); }
接近初版运行时间的 2 / 3 2/3 2/3,不错
1. 这里取了sedgewick增量序列的前几项,感兴趣的话可以去搜索了解一下怎么生成 ↩︎



