歸併排序--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);
}

運行結果:ios

運行結果 

相關文章
相關標籤/搜索