/* * 二路归并排序 * 基本思想 * 当只有一个元素的时候终止排序,超过一个元素的时候,将所有 * 元素分成大致相同的两个集合,然后分别对两个集合进行排序,最后 * 将排好序的集合进行归并 * 稳定性:稳定 * 空间复杂度:O(n) * 时间复杂度:最好O(nlog2n) 最坏O(nlog2n) 平均O(nlog2n) */ /* * 归并 */ void Merge(int a[], int low, int high) { int mid = (low + high) / 2; int d[100] = {0}; int i = low, j = mid + 1, k = 0; while(i <= mid && j <= high) { if(a[i] <= a[j]) { d[k++] = a[i++]; } else { d[k++] = a[j++]; } } while(i <= mid) { d[k++] = a[i++]; } while(j <= high) { d[k++] = a[j++]; } //归并后的结果,拷贝到原数组 for(int i=low,k=0; i<=high; i++,k++) { a[i] = d[k]; } } void MergeSort(int a[], int low, int high) { int mid = (low + high) / 2; if(low == high) { return; } MergeSort(a, low, mid); MergeSort(a, mid+1, high); Merge(a, low, high); } int main() { int a[] = {3, 8, 15, 7, 21, 6}; MergeSort(a, 0, 5); for(int i=0; i<6; i++) { cout << a[i] << " "; } cout << endl; system("pause"); return 0; }