归并排序
Posted zymmyz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序相关的知识,希望对你有一定的参考价值。
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 < n1+n2; ++i) { 32 temp[i] = array[begin+i]; 33 } 34 35 for (i = begin1, j = begin2, k = begin; i <= end1 && j <= end2; ++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 }
以上是关于归并排序的主要内容,如果未能解决你的问题,请参考以下文章