归并排序

2021-02-13 15:18

阅读:504

标签:pre   排序   另一个   ide   click   i++   isp   hid   大于   

技术图片技术图片
 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 }
归并排序

 

归并排序

标签:pre   排序   另一个   ide   click   i++   isp   hid   大于   

原文地址:https://www.cnblogs.com/zymmyz/p/12726071.html


评论


亲,登录后才可以留言!