本帖最后由 段子界的孔子 于 2021-3-31 18:26 编辑
[C] 纯文本查看 复制代码 void merge_sort(int arr[], int len) {
/*
step2-用于终止递归条件
*/
if(len <= 2) {
if (len == 2 && arr[0] > arr[1])
swap(&arr[0], &arr[1]);
return;
}
/*
step1-分段:mor用于求分段中值,以mor为中值分成两小段段进入递归
*/
int mor = len/2;
// 左半段递归
merge_sort(&arr[0], mor);
// 右半段递归
merge_sort(&arr[mor], len - mor);
/*
step3-整合:将两段有序序列整合排序成一段有序序列
*/
// 把arr中整段数据克隆到b
int *b = (int *) malloc(len * sizeof(int));
for (int i = 0; i < len; ++i) {
b[i] = arr[i];
}
// 以b作为参考数组,把arr大段排序:j 为b[]左半端指针, k 为b[]的右半段指针, n 为arr排序位指针;j的取值区间[0,mor-1],k的取值区间[mor,len-1]
int j = 0, k = mor;
for (int i = 0; i < len; ++i) {
if (j < mor && k < len) // 如果两段中,都存在未排列数组,则把首位较小的数给安排上
arr[i] = b[j] < b[k] ? b[j++] : b[k++];
else // 否则,则另一段的未排列数据直接补上
arr[i] = (j < mor) ? b[j++] : b[k++];
}
free(b);
}
我就想知晓这算不算是归并排序,因为备考用到的,代码如有错误,还请大佬不吝赐教哈
|