归并排序
2021-02-13 15:18
标签:pre 排序 另一个 ide click i++ isp hid 大于 归并排序 标签:pre 排序 另一个 ide click i++ isp hid 大于 原文地址:https://www.cnblogs.com/zymmyz/p/12726071.html 1 void mergeSort(int array[], int begin, int end) {
2 if (begin >= end) {
3 //数组长度若为1,则有序
4 return;
5 }
6 else {
7 //若长度大于1,则再进行归并排序
8 int middle = (begin + (end - begin)/2); //避免溢出
9 if (middle > begin) {
10 //对前半组进行归并排序
11 mergeSort(array, begin, middle);
12 }
13 if (end > middle +1) {
14 //对后半组进行归并排序
15 mergeSort(array, middle+1, end);
16 }
17 //将两个有序的子数组组合
18 merge(array, begin, middle, end);
19 }
20 }
21
22 void merge(int array[], int begin, int middle, int end) {
23 int n1 = middle - begin + 1; //[begin, middle]
24 int n2 = end - middle; //[middle+1, end]
25 int* temp = (int*)malloc(sizeof(int) * (n1 + n2));
26
27 int begin1 = 0, end1 = n1-1;
28 int begin2 = n1, end2 = n1+n2-1;
29
30 int i, j, k;
31 for (i = 0; i i) {
32 temp[i] = array[begin+i];
33 }
34
35 for (i = begin1, j = begin2, k = begin; i k) {
36 if (temp[i] temp[j]) {
37 array[k] = temp[i++];
38 }
39 else {
40 array[k] = temp[j++];
41 }
42 }
43
44 //结束条件为某一个子数组到界,但另一个子数组可能还没赋值完全
45 //剩余的数是有序的,直接按顺序赋值即可
46 while (i end1) {
47 array[k++] = temp[i++];
48 }
49 while (j end2) {
50 array[k++] = temp[j++];
51
52 }
53
54 free(temp);
55 }