归并排序(Merge Sort)是利用"归并"技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件。 归并排序有两种实现方法:自底向上和自顶向下。 2、自顶向下的方法
1
0
(请您对文章做出评价)
/********************************************************************** * Compiler: GCC * Last Update: Sat 05 May 2012 11:47:38 AM CST ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; //#只完成两段之间归并的功能#% void Merge(int a[], int b[], int low, int mid, int high) { int k = low; int begin1 = low; int end1 = mid; int begin2 = mid + 1; int end2 = high; while(begin1 <= end1 && begin2 <= end2) { if(a[begin1] <= a[begin2]) b[k++] = a[begin1++]; else b[k++] = a[begin2++]; } if(begin1 <= end1) for(int q = begin1; q <= end1; q++) b[k++] = a[q]; else for(int q = begin2; q <= end2; q++) b[k++] = a[q]; } void MergePass(int a[], int b[], int seg, int size) { int seg_start_ind = 0; while(seg_start_ind <= size - 2 * seg) //#size - 2 * seg的意思是满足可两两归并的最低临界值#% { Merge(a, b, seg_start_ind, seg_start_ind + seg - 1, seg_start_ind + seg * 2 - 1); seg_start_ind += 2 * seg; } //#如果一段是正好可归并的数量而另一段则少于正好可归并的数量#% if(seg_start_ind + seg < size) Merge(a, b, seg_start_ind, seg_start_ind + seg - 1, size - 1); else for(int j = seg_start_ind; j < size; j++) //#如果只剩下一段或者更少的数量#% b[j] = a[j]; } void MergeSort(int a[], int size) { int* temp = new int[size]; int seg = 1; //seg为进行归并时段的大小 while(seg < size) { MergePass(a, temp, seg, size); seg += seg; MergePass(temp, a, seg, size); seg += seg; } } int main() { int a[] = {3, 5, 3, 6, 4, 7, 5, 7, 4}; //#QQ#% MergeSort(a, sizeof(a) / sizeof(*a)); //#输出#% for(int i = 0; i < sizeof(a) / sizeof(*a); i++) cout << a[i] << ' '; cout << endl; return 0; } |
|