筆記 C 陣列排序(歸併排序)

2021-10-04 06:50:09 字數 1446 閱讀 8796

歸併排序也稱合併排序,其演算法思想是將待排序序列分為兩部分,依次對分得的兩個部分再次使用歸併排序,之後再對其進行合併。僅從演算法思想上了解歸併排序會覺得很抽象,接下來就以對序列a[0], a[l]…, a[n-1]進行公升序排列來進行講解,在此採用自頂向下的實現方法,操作步驟如下。

(1)將所要進行的排序序列分為左右兩個部分,如果要進行排序的序列的起始元素下標為first,最後乙個元素的下標為last,那麼左右兩部分之間的臨界點下標mid=(first+last)/2,這兩部分分別是a[first … mid]和a[mid+1 … last]。

(2)將上面所分得的兩部分序列繼續按照步驟(1)繼續進行劃分,直到劃分的區間長度為1。

(3)將劃分結束後的序列進行歸併排序,排序方法為對所分的n個子序列進行兩兩合併,得到n/2或n/2+l個含有兩個元素的子串行,再對得到的子串行進行合併,直至得到乙個長度為n的有序序列為止。下面通過一段**來看如何實現歸併排序。

取自:c語言中文網

取自:

通過分析,宣告「治」的函式:void merge(int arr,int low,int mid,int high);

生命「分」的函式:void merge_sort(int arr,int first,int last);

merge_sort函式**如下:

void

merge_sort

(int arr,

int first,

int last)

return

;}

merge函式**如下:

void

merge

(int arr,

int low,

int mid,

int high)

else}if

(left_low<=left_high)}if

(right_low<=right_high)

}for

(int i =

0;i1;i++

)free

(tmp)

;return

;}

標記1與標記2,例:4578,1236,上圖中資料。

4與1比較:1存入,右移到2

4與2比較:2存入,右移到3

4與3比較:3存入,右移到6

4與6比較:4存入,左側右移到5

5與6比較:5存入,左側右移到7

6與7比較:6存入。右側無法移動,所以需要將剩下的78加入到tmp中。

陣列歸併排序

include include using namespace std void print int a 歸併排序 思路 1 歸併排序 條件 小下標小,大下標大 分別對左半段和右半段進行歸併排序,然後合併 2 合併 把當前待排序列複製乙份 原來的陣列放排好序的元素 分兩段,依次比較左半段和右半段的元...

歸併排序筆記

將兩個的有序數列合併成乙個有序數列,我們稱之為 歸併 歸併排序 如果要將乙個陣列排序,可以先 遞迴地 將它們分成兩半進行排序,然後將結果歸併起來。下面介紹另外兩種方法,分別是自頂向下歸併和自底向上歸併,圖示參考連線 但是我感覺裡面的那個自下而上的演算法感覺有點複雜,所以我總結了演算法第四版上的 如下...

c 歸併排序

1.需求 將乙個陣列通過歸併排序排成有序陣列 2.思想 歸併排序是分治法的乙個典型應用,將兩個有序的序列合併成乙個有序的序列稱為歸併,歸併排序,通過將陣列分成若干個有序的序列,當拆分成只有乙個數時認為是有序的,然後將這些序列歸併。這裡需要用到遞迴。3.實現 public class msort 歸併...