C語言之合併排序

2021-07-29 01:50:43 字數 1668 閱讀 2292

一、基本運算:

兩路合併排序:將兩個有序序列合併成乙個有序序列。

二、步驟:

①把待排序的序列分成長度為1的子串行(只包含乙個記錄的序列被認為是有序的)→得到n個長度為1的有序子串行;

②實施兩兩合併,合併相鄰的兩個子串行→得到大約n/2個長度為2的有序子串行;

③重複步驟②,直到合併成乙個長度為n的有序序列為止。

三、注意:

當待排序序列個數為奇數時,最後乙個長度為1的子串行則在最後一趟進行排序。

四、舉例:

以對序列a[0], a[l]…, a[n-1]進行公升序排列來進行講解,在此採用自頂向下的實現方法,操作步驟如下。

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

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

③將劃分結束後的序列進行歸併排序,排序方法為對所分的n個子序列進行兩兩合併,得到n/2或n/2+l個含有兩個元素的子串行,再對得到的子串行進行合併,直至得到乙個長度為n的有序序列為止。

五、函式:

merge函式

①功能:將兩個有序序列合併成乙個有序序列;

②c**:

void merge(int arr,int low,int mid,int high)

{ int left_low=low; //左邊序列的左下標

int left_high=mid;

int right_low=mid+1; //右邊序列的左下標

int right_high=high;

int tmp[n],k=0,i; //陣列tmp用來存放序列元素

while(left_low<=left_high&&right_low<=right_high) //當左右序列都有元素時執行迴圈

{ if(arr[left_low]mergesort函式

①功能:通過呼叫自身**子串行;通過呼叫merge函式實現兩路合併排序。

②**:

void mergesort(int arr,int first,int last)

{ int mid = 0;

if(first六、**

#include #include #define n 7

void merge(int arr,int low,int mid,int high)

{ int left_low=low; //左邊序列的左下標

int left_high=mid;

int right_low=mid+1; //右邊序列的左下標

int right_high=high;

int tmp[n],k=0,i; //陣列tmp用來存放序列元素

while(left_low<=left_high&&right_low<=right_high) //當左右序列都有元素時執行迴圈

{ if(arr[left_low]

C語言 合併排序。

題目 設子陣列a 0 k 和a k 1 n 1 已排好序 0 k n 2 試設計乙個合併這兩個子陣列為排好序的陣列a 0 n 1 的演算法。要求演算法的在最壞情況下所用的計算時間為o n 且只用到o 1 的輔助空間。include void houyi int a,int l,int r int m...

分治 合併排序 自然合併排序(C )

演算法步驟 引用自 菜鳥教程 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置 重複步驟 3 直到某一指標達到序列尾 將另一串行剩下的所有元素直...

合併排序(C語言實現

遞迴演算法是把乙個問題分解成和自身相似的子問題,然後再呼叫自身把相應的子問題解決掉。這些演算法用到了分治思想。其基本模式如下 分解 把乙個問題分解成與原問題相似的子問題 解決 遞迴的解各個子問題 合併 合併子問題的結果得到了原問題的解。現在就用遞迴演算法,採用上面的分治思想來解合併排序。合併排序 非...