归并排序--c++

/* 来自《算法分析与设计》 代码来自网络https://blog.csdn.net/m0_38068229/article/details/81262282*/
/*
输入:数组A[1...m]和它的三个索引p,q,r,1<=p<=q<r<=m,两个子数组A[p...q]和A[q+1...r]各自按升序排列
输出:合并两个子数组A[p...q]和A[q+1...r]的数组A[p...r]
comment:B[p...r]是个辅助数组
s <- p; t <- q+1; k <- p;
while s <= q and t <= r
    if A[s] <= A[t] then
        B[k] <- A[s]
        s <- s+1
    else
        B[k] <- A[t]
        t <- t+1
    end if
    k <- k+1
end while
if s = q+1 then B[k...r] <- A[t...r]
else B[k...r] <- A[s...q]
end if
A[p...r] <- B[p...r]
*/
#include<iostream>
using namespace std;

//归并过程
void merge(int arr[], int l, int mid, int r);
//递归
static void mergeSort(int arr[], int l, int r);
//归并排序整个数组
void mergeSort(int arr[], int n);

int main()
{
    int n;
    while(cin >> n)
    {
        int arr[n];
        for(int i = 0; i < n; i++)
            cin >> arr[i];
        mergeSort(arr, n);
        cout << "After sorted:" << endl;
        for(int i = 0; i < n; i++)
            cout << arr[i] << " ";
        cout << endl;
    }
    return 0;
}

//归并
void merge(int arr[], int l, int mid, int r)
{
    int help[r-l+1];  //辅助数组
    int i = 0;
    int lIndex = l;
    int rIndex = mid+1;
    while(lIndex <= mid && rIndex <= r)
    {
        help[i++] = arr[lIndex] < arr[rIndex] ? arr[lIndex++]:arr[rIndex++];
    }
    //左边或右边有一边到头了,不可能同时到,因为每次只移动一边。
    while(lIndex <= mid)
    {
        help[i++] = arr[lIndex++];
    }
    while(rIndex <= r)
    {
        help[i++] = arr[rIndex++];
    }
    //将排好序的辅助数组复制给原始数组,不需要返回值
    for(i = 0; i < r-l+1; i++)
    {
        arr[l+i] = help[i];
    }
}

//递归
static void mergeSort(int arr[], int l, int r)
{
    if(l == r) return;
    int mid = (l+r)/2;
    //左半部分归并排序
    mergeSort(arr, l, mid);
    //右半部分归并排序
    mergeSort(arr, mid+1, r);
    //左右部分归并
    merge(arr, l, mid, r);
}

//归并排序整个数组
void mergeSort(int arr[], int n)
{
    //如果数组为空或只有一个元素,不需要排序
    if(arr == NULL || n < 2) return;
    mergeSort(arr, 0, n-1);
}

运行结果:

运行结果 

posted @ 2020-04-07 23:09  ho_ho  阅读(481)  评论(0编辑  收藏  举报