归并排序

来源:互联网 发布:域名注册购买 编辑:程序博客网 时间:2024/06/04 18:35

归并排序分为三块
1. 对外接口;
2. 迭代方法;
3. 将分别排好序的两段merge。

// 1. 对外接口void MergeSort(int arr[], int len) {    if (arr != NULL && len > 0) {        int *buf = new int[len];            // 只使用一个buf        MergeSortDC(arr, 0, len - 1, buf);          delete[] buf;    }}// 2. 迭代void MergeSortDC(int arr[], int l, int h, int buf[]) {    if (l < h) {        int mid = l + (h - l) / 2;        MergeSortDC(arr, l, mid, buf);        MergeSortDC(arr, mid + 1, h, buf);        Merge(arr, l, mid, h, buf);    }}// 3. 合并void Merge(int arr[], int l, int mid, int h, int buf[]) {    for (int i = l; i <= h; ++i)        // 先将待merge部分copy到buf中        buf[i] = arr[i];    int bufLeft = l, bufRight = mid + 1;    // 分别定位前后两段的最小值    int cur = l;    while (bufLeft <= mid && bufRight <= h) {        if (buf[bufLeft] <= buf[bufRight]) {            arr[cur++] = buf[bufLeft++];        } else {            arr[cur++] = buf[bufRight++];        }    }    // 此时有两种情况:    // 1. 左半段余若干最大值    int remaining = mid - bufLeft + 1;  // 左端还剩下多少没copy到arr    // +1是因为bufLeft指向的是第一个未copy到arr的值!    for (int i = 0; i < remaining; ++i) {        arr[cur + i] = buf[bufLeft + i];    }    // 2. 右半段余若干最大值    // arr中已有,不需再从buf复制过来}

尤其要注意:
合并步骤,最后将左半段剩余最大的数值copy到arr时,remaining的值!