1. 程式人生 > >八大排序演算法之五——歸併排序

八大排序演算法之五——歸併排序

1、基本思想。

歸併排序是將兩個(或兩個以上)的有序表合併成一個新的有序表。

2、實現。

/**
 * @brief mergeSortedArray 將兩個已經排好序的區間
 *  [first,mid] 、[mid+1,last] 合併成一個排好序的區間
 * @param array 總區間的起始地址
 * @param first 第一個有序區間的起點
 * @param mid   第一個有序區間的終點
 * @param last  第二個區間的終點
 */
void mergeSortedArray(int* array,int first,int mid,int last)
{
    int* tempArray=(int*)malloc((last-first+1)*sizeof(int));
    int indexPre=first;
    int indexRear=mid+1;
    int tempArrayIndex=0;
    for(;indexPre<=mid&&indexRear<=last;tempArrayIndex++)
    {
        if(array[indexPre]<=array[indexRear])
        {
            tempArray[tempArrayIndex]=array[indexPre++];
        }
        else
        {
            tempArray[tempArrayIndex]=array[indexRear++];
        }
    }

    if(indexPre<=mid)
    {
        for(int i=indexPre;i<=mid;++i)
        {
            tempArray[tempArrayIndex++]=array[i];
        }
    }

    if(indexRear<=last)
    {
        for(int i=indexRear;i<=last;++i)
        {
            tempArray[tempArrayIndex++]=array[i];
        }
    }

    for(int i=0;i<last-first+1;++i)
    {
        array[i+first]=tempArray[i];
    }
    free(tempArray);
}

void mergeSort(int* array,int first,int last)
{
    int mid=0;
    if(first<last)
    {
        mid=(first+last)/2;
        mergeSort(array,first,mid);
        mergeSort(array,mid+1,last);
        mergeSortedArray(array,first,mid,last);
    }
    return;
}


int main()
{
    int a[10]={11,42,53,25,36,6,75,8,26,4};
    std::cout<<"before sort:"<<std::endl;
    for(int i=0;i<10;++i)
        std::cout<<a[i]<<"\t";
    std::cout<<std::endl;

    mergeSort(a,0,9);

    std::cout<<"after sort:"<<std::endl;

    for(int i=0;i<10;++i)
        std::cout<<a[i]<<"\t";
    std::cout<<std::endl;
    return 0;
}

3、執行結果。

相關推薦

八大排序演算法——歸併排序

1、基本思想。歸併排序是將兩個(或兩個以上)的有序表合併成一個新的有序表。2、實現。/** * @brief mergeSortedArray 將兩個已經排好序的區間 * [first,mid] 、[mid+1,last] 合併成一個排好序的區間 * @param a

排序演算法二:歸併排序

演算法分析:是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。 將已有序的子序

Java八大排序演算法"希爾排序(最小增量排序)"演算法

希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因DL.Shell於1959年提出而得名。 ———————-本段來自百度百科 是插入排序的一種,只不

八大排序演算法詳解——歸併排序

基本思想 n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果: 初始狀態:無序區為R[1..n],有序區為空。 第1趟排序: 在無序區R[1..n]中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[1] 交換,使R[1..1

白話經典算法系列 歸併排序的實現(講的真好)

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。 首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第一個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再

白話經典算法系列 歸併排序的實現

 歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列

【S-排序】python實現八大排序演算法9-桶排序(BucketSort)

桶排序 基本思想: 基本思想很簡單,如果有一個數組A,包含N個整數,值從1到M,桶排序(BucketSort)。留置一個數組S,裡面含有M個桶,初始化為0。然後遍歷陣列A,讀入Ai時,S[Ai]增一

JavaScript 資料結構與演算法美 - 歸併排序、快速排序、希爾排序、堆排序

1. 前言 演算法為王。 想學好前端,先練好內功,只有內功深厚者,前端之路才會走得更遠。 筆者寫的 JavaScript 資料結構與演算法之美 系列用的語言是 JavaScript ,旨在入門資料結構與演算法和方便以後複習。 之所以把歸併排序、快速排序、希爾排序、堆排序放在一起比較,是因為它們的平均時

【Java】 大話資料結構(17) 排序演算法(4) (歸併排序) 資料結構與演算法合集 資料結構與演算法合集

本文根據《大話資料結構》一書,實現了Java版的堆排序。 更多:資料結構與演算法合集 基本概念   歸併排序:將n個記錄的序列看出n個有序的子序列,每個子序列長度為1,然後不斷兩兩排序歸併,直到得到長度為n的有序序列為止。   歸併方法:每次在兩個子序列中找到較小的那一個賦值給合併序列(通過指標進行操

排序演算法希爾排序【java實現】

前面介紹的冒泡、選擇、插入排序演算法雖然簡單直觀,但是在排序上的效率一般。對於大量的資料排序就需要更加高效的演算法,那麼下面來介紹一下高效的排序演算法----希爾排序,又稱Shell排序,縮小增量排序。 實際上,希爾排序是基於插入排序的思想。 實現步驟: (1)將有n個元素的陣列分成n/

插入排序演算法折半插入排序演算法

之前有學過二分查詢,其實折半插入跟二分查詢都是同一個原理。在百度百科開了折半排序演算法的原理後,自己試著根據原理寫出了版本一的演算法,版本二是參照巨人的實現思想,版本二才是重點。版本一可以忽略不看。 演算法同樣的目的是尋找正確的插入點。 版本一: 實現思想: 第一步:獲取折半後的下標

排序演算法5】歸併排序

歸併排序是分治法的一種典型應用。 歸併排序的原理是合併兩個有序序列是簡單的。 先對元素進行分割,分割到最後只有單一元素的時候進行歸併。兩兩一組自底向上歸併。 #include <stdio.h> #include <Windows.h> #include "M

排序演算法 簡單插入排序

  簡單插入排序演算法原理:從整個待排序列中選出一個元素插入到已經有序的子序列中去,得到一個有序的、元素加一的子序列,直到整個序列的待插入元素為0,則整個序列全部有序。   在實際的演算法中,我們經常

排序演算法6——圖解歸併排序及其遞迴與非遞迴實現

排序演算法1——圖解氣泡排序及其實現(三種方法,基於模板及函式指標) 排序演算法2——圖解簡單選擇排序及其實現 排序演算法3——圖解直接插入排序以及折半(二分)插入排序及其實現 排序演算法4——圖解希爾排序及其實現 排序演算法5——圖解堆排序及其實現 排序演算法6——圖解歸併排序及其遞迴與非

排序演算法希爾排序

演算法分析: 希爾排序(Shell Sort)是插入排序的一種,其實質就是分組插入排序,該方法又稱縮小增量排序,因D.L.Shell於1959年提出而得名。它是對直接插入排序的一種改進,通過加大插入排序中元素之間的間隔,並在這些有間隔的元素中進行插入排序,從而使得資料項大跨

排序演算法希爾排序 java實現

知識準備 基礎概念 希爾排序:在直接插入排序的基礎上進行的優化,直接插入排序在n值小的時候效率比較高,在n很大的時候如果待排序序列基本有序,效率依然很高,時間效率可以提升為O(n)。希爾排序也稱之為縮小增量排序。 1.先選取一個小於n的整數d(步長

排序演算法直接插入排序和希爾排序

相信許多人和我一樣,排序演算法看了好幾遍,當時看懂了,過幾天一些細節又忘記,所以現在講排序演算法做一個總結,從最基本的排序演算法展開來,首先分析直接插入排序和希爾排序。 1.直接插入排序 思想:把一個數插入到已經排序的有序序列中; 方法:將這個數與有序序列

排序演算法希爾排序法(c#實現)

希爾排序演算法是將陣列的所有元素按照一定增量d分組,對每組內的資料實行插入排序,之後不斷減小增量,每組內所包含的元素也越多,增量減少至1時,整個陣列被分成一組,插入排序結束後整個陣列的排序便完成。演算法流程圖:操作步驟:初始時,有一個大小為 10 的無序序列。(1)在第一趟排

排序演算法Java實現——歸併排序

歸併排序(也可以叫合併排序),其實歸併排序的本質就是合併排序。 它是與插入排序、交換排序、選擇排序不同的一類排序方法,不同之處在於: 它要求:待排序序列是由若干個有序子序列組成。 那麼究竟什麼是歸併排序呢?歸併這個詞到底是什麼意思? 首先可以理解為就是合併,然後就是這個詞的

圖解排序演算法及實現——歸併排序 (Merge Sort)

思路 歸併排序(MergeSort),是建立在歸併操作上的一種有效的排序演算法,效率為O(nlogn) 。1945年由約翰·馮·諾伊曼首次提出。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用,且各層分治遞迴可以同時進行。 實