排序演算法 合併排序

2021-06-09 01:19:16 字數 926 閱讀 5438

說明

之前所介紹的排序法都是在同乙個陣列中的排序,考慮今日有兩筆或兩筆以上的資料,它可能是不同陣列中的資料,或是不同檔案中的資料,如何為它們進行排序?解法

可以使用合併排序法,合併排序法基本是將兩筆已排序的資料合併並進行排序,如果所讀入的資料尚未排序,可以先利用其它的排序方式來處理這兩筆資料,然後再將排序好的這兩筆資料合併。有人問道,如果兩筆資料本身就無排序順序,何不將所有的資料讀入,再一次進行排序?排序的精神是盡量利用資料已排序的部份,來加快排序的效率,小筆資料的排序較為快速,如果小筆資料排序完成之後,再合併處理時,因為兩筆資料都有排序了,所有在合併排序時會比單純讀入所有的資料再一次排序來的有效率。

那麼可不可以直接使用合併排序法本身來處理整個排序的動作?而不動用到其它的排序方式?

答案是肯定的,只要將所有的數字不斷的分為兩個等分,直到最後剩乙個數字為止,然後再反過來不斷的合併,就如下圖所示:

不過基本上分割又會花去額外的時間,不如使用其它較好的排序法來排序小筆資料,再使用合併排序來的有效率。下面的程式範例,使用的是快速排序法來處理小筆資料排序,然後再使用合併排序法處理合併的動作。  

**:

//這個快速排序法的概念,它以最右邊的值s作比較的標準,將整個數列分為三個部份,

//乙個是小於s的部份,乙個是大於s的部份,乙個是未處理的部份

int partition(int number,int left, int right) //尋找軸所在的正確位置

{ int i,j,s;

int temp;

s = number[right];

i = left - 1;

j = left;

for(j=left;j

排序演算法 合併排序

這個排序比起冒泡,選擇什麼的就快很多了,時間複雜度是n logn,但是實現起來也很複雜。原理是 第一步,合併1 2 3 4 5 6.相鄰兩個排序 第二步,合併1 2 3 4 5 6 7 8 9.相鄰四個排序 實現起來最主要的是合併的函式,廢話不多說,看 class mergersorter priv...

合併排序演算法

陣列ary的m個元素,ary p ary q ary q 1 ary r 已按曾序排序 使得ary p ary r 按曾序排列 void clibrary merge int ary,int p,int q,int r,int m else k 0 for i p i r i ary i bp k ...

合併排序演算法

主要思想 不斷將已經有序的子陣列a p.q 和a q 1.r 合併為新的有序的陣列a p.r 具體過程可如下操作 分解 將n個元素分成各含n 2個元素的子串行 解決 對兩個子陣列遞迴地排序 合併 合併兩個已經有序的子陣列得到最終的有序陣列。合併 歸併排序 分治策略 include include u...