归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。
//将有序数组a[]和b[]合并到c[]中 void MemeryArray(int a[], int n, int b[], int m, int c[]) { int i, j, k; i = j = k = 0; while (i < n && j < m) { if (a[i] < b[j]) c[k++] = a[i++]; else c[k++] = b[j++]; } while (i < n) c[k++] = a[i++]; while (j < m) c[k++] = b[j++]; }
void Merge(int src[], int des[], int low, int mid, int high) { int i = low; int j = mid + 1; int k = low; while( (i <= mid) && (j <= high) ) //将小的放到目的地中 { if( src[i] < src[j] ) { des[k++] = src[i++]; } else { des[k++] = src[j++]; } } while( i <= mid ) //若还剩几个尾部元素 { des[k++] = src[i++]; } while( j <= high ) //若还剩几个尾部元素 { des[k++] = src[j++]; } } //每次分为两路 当只剩下一个元素时,就不需要在划分 void MSort(int src[], int des[], int low, int high, int max) { if( low == high ) //只有一个元素,不需要归并,结果赋给des[low] { des[low] = src[low]; } else //如果多个元素,进行两路划分 { int mid = (low + high) / 2; int* space = (int*)malloc(sizeof(int) * max); //递归进行两路,两路的划分 //当剩下一个元素的时,递归划分结束,然后开始merge归并操作 if( space != NULL ) { MSort(src, space, low, mid, max); MSort(src, space, mid+1, high, max); Merge(space, des, low, mid, high); //调用归并函数进行归并 } free(space); } } void MergeSort(int array[], int len) // O(n*logn) { MSort(array, array, 0, len-1, len); } int main() { //int array[] = {21, 25, 49, 25, 16, 8}; int array[] = {21, 25}; int len = sizeof(array) / sizeof(*array); printArray06(array, len); MergeSort(array, len); printArray06(array, len); system("pause"); return 0; }