排序 歸併排序

2021-06-21 12:04:40 字數 1618 閱讀 5796

歸併(merge)排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。

2-路歸併演算法

1.演算法基本思路

設兩個有序的子檔案(相當於輸入堆)放在同一向量中相鄰的位置上:sr[low..m],sr[m+1..high],先將它們合併到乙個區域性的暫存向量tr(相當於輸出堆)中,待合併完成後將tr複製回sr[low..high]中。

2.合併過程

(1)比較兩個子串行的第乙個元素的關鍵字(sr[low].key和sr[m+1].key),將較小的那個元素放置到暫存向量

tr[low++]

中,然後再用該元素的下乙個元素代替它進行下一次的比較(較大的元素不變),知道其中乙個子串行為空為止。然後把不為空的子串行全部複製到tr[low]的尾部。

3.演算法實現,演算法演示:【

參見動畫演示

templatevoid merge(t sr,t tr,int low,int mid,int high) //歸併排序   

while(i <= mid) //如果前一半中還有未處理完的資料,按順序移入動態分配的陣列內

tr[k++] = sr[i++];

while(j <= high) //如果後一半中還有未處理完的資料,按順序移入動態分配的陣列內

tr[k++] = sr[j++];

for( k = 0, i = low;i <= high;k++,i++) //將排序好的資料移回到原序列中

sr[i] = tr[k];

}

歸併排序的三個步驟是:

①分解:將當前區間一分為二,即求**點

:m=[low+hight]/2;

②求解:遞迴地對兩個子區間r[low..mid]和r[mid+1..high]進行歸併排序;

③組合:將已排序的兩個子區間r[low..mid]和r[mid+1..high]歸併為乙個有序的區間r[low..high]。

遞迴的終結條件:子區間長度為1(乙個記錄自然有序)。

演算法**:

具體**:

templatevoid msort(t a,t temp,int low,int high)  

}

templateinline void mergesort(t* sr,int len) //歸併排序演算法   

二、演算法分析(在一般情況下很少使用2-路歸併排序法進行內部排序)

1、穩定性

其最大特點就是,歸併排序是一種穩定的排序。

2、儲存結構要求

可用順序儲存結構。也易於在鍊錶上實現。

3、時間複雜度

無論是在最好情況下還是在最壞情況下均是o(nlgn)。

4、空間複雜度

需要乙個輔助向量來暫存兩有序子檔案歸併的結果,故其輔助空間複雜度為o(n),顯然它不是就地排序。

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...

排序 歸併排序

利用遞迴的思想,當n 1時,只有乙個元素需要排序,為遞迴臨界條件 否則,遞迴的將前半部分資料和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後再將得到的兩部分合併到一起。mergesort algorithm public void mergesort int data mergesort例程...

排序 歸併排序

概述 歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。基本思想 將待排序序列r 0.n...