void merge(int array[], int start, int mid, int end){
    int i = start;
    int j = mid + 1;
    int k = 0;

    int *tmp = new int[end-start+1] {0};

    while (i<=mid && j<=end) {
        if(array[i] <= array[j])
        {
            tmp[k++] = array[i++];
        }else {
            tmp[k++] = array[j++];
        }
    }
    while (i<=mid) {
        tmp[k++] = array[i++];
    }

    while (j<=end) {
        tmp[k++] = array[j++];
    }

    // 将排序后的元素,将tmp整合到数组a中。
    for (int m=0; m<k; m++) {
        array[start+m] = tmp[m];
    }

    delete [] tmp;

}

// 递归调用函数
void merge_sort_c(int array[], int start, int end)
{
    // 递归终止条件
    if (start >= end) return;

    // 取 start 到 end 之间的中间位置 mid, 并避免整型溢出
    int mid = start + (end - start) / 2;
    // 分治递归
    merge_sort_c(array, start, mid);
    merge_sort_c(array, mid+1, end);
    // 将 A[p...q] 和 A[q+1...r] 合并为 A[p...r]
    // merge(A[p...r], A[p...q], A[q+1...r]);
    // cout<<"("<<p<<"~"<<q<<")"<<" ("<<q+1<<"~"<<r<<")"<<endl;
    merge(array, start, mid, end);
}

// 归并排序算法, A 是数组,n 表示数组大小
void merge_sort(int array[], int size) {
    merge_sort_c(array, 0, size-1);
}

int main()
{
    int array[7] = {10, -22, 211, 120, 23, 120, -2};
    int size = sizeof (array) / sizeof (*array);

    printArray(array, size);

    merge_sort(array, size);

    printArray(array, size);
    return 0;
}


备份地址: 【O(nLogn)排序 :归并