归并排序(非原地版)

归并排序

递归版

#include <iostream>
using namespace std;

// reg 是临时存储归并结果的数组
void merge(int* arr, int* reg, int start, int end) {
    if (start >= end)
        return;
    int left = start;
    int right = end;
    int mid = (left + right) / 2;
    merge(arr, reg, left, mid);
    merge(arr, reg, mid + 1, right);
    int start1 = left;
    int start2 = mid + 1;
    int resIdx = left;
    while (start1 <= mid && start2 <= right) {
        reg[resIdx++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
    }
    while (start1 <= mid) {
        reg[resIdx++] = arr[start1++];
    }
    while (start2 <= right) {
        reg[resIdx++] = arr[start2++];
    }
    // 将reg中的归并结果回填到arr中
    for (resIdx = start; resIdx <= end; resIdx++) {
        arr[resIdx] = reg[resIdx];
    }
}

void mergeSort(int* arr, int* reg, const int size) {
    merge(arr, reg, 0, size - 1);
}

int main() {
    int size, i;
    cin >> size;
    int *arr = new int[size];
    for (i = 0; i < size; i++) {
        cin >> arr[i];
    }
    int *reg = new int[size];
    mergeSort(arr, reg, size);
    cout << endl;
    cout << "Result:" << endl;
    for (i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
    delete [] arr;
    delete [] reg;
    return 0;
}

迭代版

#include <iostream>
using namespace std;

void mergeSort(int arr[], int len) {
    int *a = arr;
    int *b = new int[len];
    int seg, start;
    for (seg = 1; seg < len; seg++) { //每轮增大归并段长度
        for (start = 0; start < len; start += seg + seg) { // 每轮按照固定归并段长度归并所有数据
            int mid = min(start + seg, len), end = min(start + seg + seg, len);
            int start1 = start, end1 = mid, start2 = mid, end2 = end;
            int k = start;
            while (start1 < end1 && start2 < end2) {
                b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
            }
            while (start1 < end1) {
                b[k++] = a[start1++];
            }
            while (start2 < end2) {
                b[k++] = a[start2++];
            }
        }
        swap(a, b); // 每次进行归并的时候,b代表新数据,a代表旧数据,所以要进行交换
    }
    if (a != arr) {  // a在每次循环结束之后都是代表最新数据,所以要保证最新数据回填
        for (int i = 0; i < len; i++)
            b[i] = a[i];
        b = a;
    }
    delete [] b;
}

int main() {
    int size;
    cin >> size;
    if (size <= 0)
        return -1;
    int *arr = new int[size];
    int i;
    for (i = 0; i < size; i++) {
        cin >> arr[i];
    }
    mergeSort(arr, size);
    for (i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
    return 0;
}
posted @ 2018-01-13 13:10  言何午  阅读(207)  评论(0)    收藏  举报