新手講排序 歸併排序

2021-07-23 10:55:17 字數 1270 閱讀 8454

歸併排序給我的感覺:程式設計一定要認真,不然就算你能想通也要糾纏你很長時間

(1)本質:

1.分解:用二分法,每次將陣列分成兩個元素數量相同或者差乙個(奇數)的子陣列,然後遞迴直到將子陣列分成乙個乙個的元素,實際陣列不用分,你直接將它看成已經分好的元素

2.合併:將len=1的陣列合併成len=2的陣列,合併的時候通過將兩個陣列的元素按大小插入到臨時陣列,再將臨時陣列元素賦予原陣列,所以我們得到從len=1到len=len/2的每乙個陣列都是有序的

(2)例子: 10個元素的例子

1.   10,8,9,2,5,4,6,3,7,1(直接看成拆分之後的資料)

2.第一次合併 8,10   2,9    4,5    3,6    1,7

3.第二次合併  2,8,9,10     3,4,5,6     1,7

4.第四次合併   2,3,4,5,6,8,9,10   1,7

5.第五次合併  1,2,3,4,5,6,7,8,9,10

(3)**:

1 #include2

using

namespace

std;3//

這個邏輯比較簡單,兩個陣列都有序,通過將他們插入到臨時陣列來合併

4void merge(int *a,int low,int mid,int

high)

12while(i<=mid) temp[num++]=a[i++];

13while(j<=high) temp[num++]=a[j++];

14for(i=0;i1;i++)

1718

} 19

void merge_pass(int *a,int gap,int

length)

25//

此時i+2*gap-1>length;此時的i-126

//如果此時i+gap-1>=length ,說明此時最後剩乙個區間了,那顯然不用與任何其他區間合併

27if(i+gap-11)

30}31//

上面是合併兩個區間的,這裡利用迴圈,將它最終合併成乙個區間

32void merge_sort(int *a,int

length)

36int

main()

43merge_sort(a,n);

44for(i=0;i)

45 cout

46 cout<

47return0;

48 }

歸併排序

歸併排序 小講

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。值得注意的是歸併排序是一種穩定的排序方法。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸...

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。2 路歸併演算法 1.演算法基本思路 設兩個有序的子檔...