#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* 归并“治”思想:将两个有序区间,排成一个有序区间
* 两边比较末端最小值,收到容器里
*/
void mergeAdd(int arr[], int left, int mid, int right, int* temp) {//实现“治”
int i = left;
int j = mid + 1;
int k = left;
while (i <= mid && j <= right)
temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
while (i <= mid)
temp[k++] = arr[i++];
while (j <= right)
temp[k++] = arr[j++];
memcpy(arr + left, temp + left, sizeof(int) * (right - left + 1));
}
/* 归并分:取中间轴分成两个区域
* 对新的区域再进行分割
* O(nlogn) O(n) 稳定
*/
void mergeSort(int arr[], int left, int right, int* temp) {//实现“分”
if (left >= right)
return;
int mid = left + (right - left) / 2;
/* 分:左右两个区间【left, mid】 【mid+1,right】 */
mergeSort(arr, left, mid, temp);
mergeSort(arr, mid + 1, right, temp);
/* 治:两边对比拿小的,全拿 */
mergeAdd(arr, left, mid, right, temp);
return;
}
int main() {
int arr[] = {11, 1, 4, 5, 7, 2,3,6,9 };
int len = sizeof(arr) / sizeof(arr[0]);
printf("before:"); for (int i = 0; i < len; i++) printf("%d ", arr[i]);
int* temp = (int*)malloc(sizeof(int) * len);
mergeSort(arr, 0, len - 1, temp);
free(temp);
printf("\nafter :"); for (int i = 0; i < len; i++) printf("%d ", arr[i]); printf("\n");
system("pause");
return 0;
}
12-22
07-11
07-11
07-11
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交