歸併排序給我的感覺:程式設計一定要認真,不然就算你能想通也要糾纏你很長時間
(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.演算法基本思路 設兩個有序的子檔...