歸并排序

歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。

從上往下的歸并排序過程

從上往下的歸并排序:它與"從下往上"在排序上是反方向的。它基本包括3步:

  1. 分解 -- 將當前區(qū)間一分為二,即求分裂點 mid = (low + high)/2;
  2. 求解 -- 遞歸地對兩個子區(qū)間a[low...mid] 和 a[mid+1...high]進行歸并排序。遞歸的終結(jié)條件是子區(qū)間長度為1。
  3. 合并 -- 將已排序的兩個子區(qū)間a[low...mid]和 a[mid+1...high]歸并為一個有序的區(qū)間a[low...high]。

C語言的實現(xiàn):

MergingSort.h

#include <stdio.h>
#include <cstdlib>
#define MAXSIZE 100
typedef int Elemtype;
void MSort(int SR[], int Temp[], int l, int r);
void Merge(int SR[], int Temp[], int l, int r, int rightEnd);
void MergeSort(int SR[], int length);

//Temp臨時數(shù)組
void MSort(int SR[], int Temp[], int l, int r)
{
    int mid;
    if (l < r) //只剩一個元素,不需要再分
    {
        mid = (l + r) / 2;
        MSort(SR, Temp, l, mid);
        MSort(SR, Temp, mid + 1, r);
        //歸并
        Merge(SR, Temp, l, mid + 1, r);
    }
}

//SR-待排數(shù)組,Temp-臨時數(shù)組,l-左邊數(shù)組起始位置,r-右邊數(shù)組起始位置,rightEnd-右邊數(shù)組終止位置
void Merge(int SR[], int Temp[], int l, int r, int rightEnd)
{
    int leftEnd, ElementNum, Tmp;
    leftEnd = r - 1;               //左邊數(shù)組終點位置
    Tmp = l;                       //歸并后數(shù)組的起始位置
    ElementNum = rightEnd - l + 1; //元素個數(shù)

    //歸并過程
    while (l <= leftEnd && r <= rightEnd)
    {
        if (SR[l] <= SR[r])
            Temp[Tmp++] = SR[l++];
        else
            Temp[Tmp++] = SR[r++];
    }
    //剩余
    while (l <= leftEnd)
        Temp[Tmp++] = SR[l++];
    while (r <= rightEnd)
        Temp[Tmp++] = SR[r++];
    //將臨時數(shù)組Temp中的元素賦值給SR
    for (int i = 0; i < ElementNum; i++, rightEnd--)
        SR[rightEnd] = Temp[rightEnd];
}
//為歸并函數(shù)設(shè)置統(tǒng)一接口
void MergeSort(int SR[], int length)
{
    int *Temp;
    Temp = (int *)malloc(length * sizeof(int));

    if (Temp)
    {
        MSort(SR, Temp, 0, length - 1);
        free(Temp);
    }
    else
        printf("error!\n");
}

MergingSort_test.c

#include "MergingSort.h"

int main()
{
    int length, i;
    printf("Enter nums:\n");
    scanf("%d", &length);
    int *SR;
    SR = (int *)malloc(length*sizeof(int));
    printf("Enter SR[]:\n");
    for (i = 0; i < length; i++)
        scanf("%d", &SR[i]);
    MergeSort(SR, length);
    for (i = 0; i < length; i++)
        printf("%d ", SR[i]);
    printf("\n");

    system("PAUSE");
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 數(shù)據(jù)結(jié)構(gòu)與算法--歸并排序 歸并排序 歸并排序基于一種稱為“歸并”的簡單操作。比如考試可能會分年級排名和班級排名,...
    sunhaiyu閱讀 996評論 0 6
  • 歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非...
    NEXTFIND閱讀 1,049評論 0 0
  • 歸并排序 所謂歸并,就是將兩個或兩個以上的有序表合并成一個新的有序表。如下圖所示,有兩個已經(jīng)排好序的有序表A[1]...
    JackChen1024閱讀 2,461評論 0 4
  • 歸并排序是利用歸并的思想對數(shù)列進行排序。--將兩個有序數(shù)列合并成一個有序數(shù)列,稱之為“歸并”,歸并包括從上往下和從...
    Joe_HUST閱讀 530評論 0 3
  • 歸并排序就這么簡單 從前面已經(jīng)講解了冒泡排序、選擇排序、插入排序,快速排序了,本章主要講解的是歸并排序,希望大家看...
    Java3y閱讀 600評論 2 6

友情鏈接更多精彩內(nèi)容