歸併排序的學習

2021-06-19 22:51:15 字數 1430 閱讀 9578

歸併排序是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半子表合併成為越來越大的有序序列,歸併排序包括兩個步驟,分別為:

1)劃分子表

2)合併半子表 

首先我們來討論歸併演算法,歸併演算法將一系列資料放到乙個向量中,索引範圍為[first,last],這個序列由兩個排好序的子表構成,以索引終點(mid)為分界線,以下面乙個序列為例

7,10,19,25,12,17,21,30,48

這樣的乙個序列中,分為兩個子串行 7,10,19,25  和 12,17,21,30,48,如下圖所示:

再使用歸併演算法的時候的步驟如下:

第一步:比較v[indexa]=7和v[indexb]=12,將較小的v[indexa]取出來放到臨時向量temparray中,然後indexa加1

第二步:比較v[indexa]=10和v[indexb]=12,將較小的10放到臨時變數temparray中,然後indexa++;

第三步:比較v[indexa]=19與v[indexb]=12,將較小的12存放到臨時變數temparray中,然後indexb++;

第四步到第七步:按照以上規則,進行比對和儲存,得到如下結果:

最後一步:將子表b中剩餘項新增到臨時向量temparray中

然後將臨時變數中的值按照索引位置,拷貝回向量v中,就完成了對向量v的歸併排序

void mergearrey(int a,int first,int mid,int last,int temp)

} while(i<=m)

temp[k++]=a[i++];

while(j<=n)

temp[k++]=a[j++];

for(i=first;i<=last;i++)

a[i]=temp[i];

}void mergesort(int a,int f,int l,int temp)

{ if(f

歸併排序以及歸併排序的優化

1 歸併排序的實現 歸併排序也利用了分治法的思想,首先將序列分成左右兩部分,將左右兩部分分別排序,然後將有序的兩個子串行進行合併 即merge操作 程式是遞迴進行的,主函式實現如下 歸併排序主函式 void merge sort int a,int first,int last else while...

歸併排序的優化 自然歸併排序

不知道怎麼將這個演算法思想表達的更好,也不知道自己的理解的是否對 黑體的注釋是普通的自然歸併,從相鄰長度為1的子陣列段進行合併也就是一開始將每兩個相鄰元素進行歸併,然後再相鄰四個元素左右兩組都有序的合併成4個有序的.自下向上不斷往上歸併直到有序 自然合併排序是合併排序演算法的一種改進.自然合併排序 ...

歸併排序學習整理

歸併排序 merge sort 是利用歸併的思想實現的排序方法,該演算法採用經典的分治 divide and conquer 策略 分治法將問題分 divide 成一些小的問題然後遞迴求解,而治 conquer 的階段則將分的階段得到的各答案 修補 在一起,即分而治之 將已有序的子串行合併,得到完全...