演算法導論之二歸併排序法

2021-06-25 08:54:03 字數 2092 閱讀 6259

分治法的思想是將原問題分解為幾個規模較小但類似於原問題的子問題,遞迴地求解這些子問題,然後再合併這些子問題的解來建立原問題的解。

歸併排序演算法完全遵循分治模式,操作步驟如下:

分解:將待排序的n個元素的序列分解為分別具有n/2個元素的兩個子串行。

解決:使用歸併排序遞迴地排序兩個子串行。

合併:合併兩個已排序的子串行以產生已排序的原序列。

「合併」操作中通過呼叫乙個輔助過程merge(a,p,q,r)來完成,其中a是乙個陣列,p,q和r是陣列下表,滿足,該過程假設子陣列a[p..q]和a[q+1..r]都已排好序。該過程合併這兩個子陣列形成單一的已排好序的子陣列並代替當前子陣列a[p..r]。

偽**如下,需要注意,在每個子陣列的末尾增加一張哨兵值,以避免在每個基本步驟中必須檢查是否子陣列為空:

merge(a,p,q,r)

n1 = q – p + 1             //計算子陣列a[p..q]的長度n1

n2 = r – q                    //計算子陣列a[q+1 ..r]的長度n2

//建立長度分別為n1+1和n2+1的陣列l和r,陣列的額外位置儲存哨兵值

let l[1..n1+1] and r[1..n2+1] be new arrays  

for i = 1 to n1

l[i] = a[p + i - 1]           //將子陣列a[p..q]複製到l[1..n1]

for j = 1 to n2

r[j] = a[q + j]       //將子陣列a[q+1 ..r]複製到r[1..n2]

l[n1 + 1] =

r[n2 + 1] =           //將哨兵值放在陣列l和r的末尾

i = 1

j = 1

//在開始迴圈的每次迭代時,子陣列a[p..k-1]按從小到大的順序依次包含l和r中的k-p個//最小元素,進而,l[i]和r[j]是各自所在陣列中未被複製回陣列a的最小元素

for k = p to r

if  l[i] <= r[j]

a[k] =l[i]

i = i + 1

else

a[k] = r[j]

j = j + 1

下面的過程merge-sort(a,p,r)排序子陣列中a[p..r]中的元素,其中將merge過程作為歸併排序演算法中的乙個子程式來應用:

merge-sort(a,p,r)

if  p< r

q= merge-sort(a,p,q)

merge-sort(a,q+1,r)

merge(a,p,q,r)

程式**如下:

#include "stdio.h"

#include "stdlib.h"

#define max 10

void print_array(int *array_test,unsignedint x)

printf("\n"); }

static void merge(int array,int low,intmid,int high)

else

} //若第乙個序列有剩餘,直接拷貝出來粘到合併序列尾

while(begin1<=end1)

//若第二個序列有剩餘,直接拷貝出來粘到合併序列尾

while(begin2<=end2)

//將排序好的序列拷貝回陣列中

for(i=0;i<(high-low+1);i++)

printf("合併: ");

print_array(array,max);

free(temp); }

void merge_sort(int array,unsigned intfirst,unsigned int last)

} int main() ;

printf("start:");

print_array(array_test,max);

merge_sort(array_test,0,9);

printf("end:");

print_array(array_test,max);

return0; }

演算法導論 歸併排序

public class mergesort mergesort data,0,中間 mergesort data,中間,最後 merge data,0,最後 system.out.println 排序前 for int i 0 i9 i 10 0 system.out.println system...

演算法導論 歸併排序

演算法的設計有很多思想,之前的插入排序使用的是增量的方法,即在排好的子陣列a中,將元素a j 插入,形成新的子陣列a。這次將實現另一種排序 歸併排序,歸併排序採用了 分治法 divide and conquer 本篇中包含 分治法,也可以稱為分治策略 是將乙個大規模的問題 原問題 劃分成n個規模較小...

演算法導論 歸併排序

歸併排序的步驟分為三個 將問題分解為更小的問題,然後解決小問題,將小問題合併為大問題的解。針對歸併排序的主要思想是 將乙個需要排序的陣列一分為二,然後將這兩部分進行單獨排序,然後將這兩個排好序的子數組合然後按照順序合併為大陣列。還有乙個就是邊界問題,將陣列無限的分下去知道最後的子陣列只剩乙個元素的時...