歸併排序 總結

2022-03-14 06:45:31 字數 1748 閱讀 2792

歸併排序(merge sort)是利用「歸併」技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。

設兩個有序的子檔案(相當於輸入堆)放在同一向量中相鄰的位置上:r[low..m],r[m+1…high],先將它們合併到乙個區域性的暫存向量r1(相當於輸出堆)中,待合併完成後將r1複製回r[low…high]中。

歸併排序的演算法思想是分而治之(divide-conquer),每個遞迴過程分為三個步驟:

1)分解:把待排序的n個元素的序列分解成兩個子串行,每個子串行包括n/2個元素;

2)治理:對每個子串行分別呼叫歸併排序(mergesort),進行歸併操作;

3)合併:合併兩個排好序的子串行,生成排序結果。

歸併排序是乙個基於分治法的比較排序演算法。目前看來還不錯,那麼當我們有乙個非常大的列表需要排序。顯然,如果我們將列表分成兩個子列表,然後排序他們會更好些。如果等分以後還是太大,那就繼續分割,知道我們可以很簡單排序為止,如下圖。。

上圖描述了在演算法中的某些步驟,我們已經得到兩個排好序的列表,接著要做的就是巧妙地合併它們。然而,這也不是特別難。我們可以比較兩個列表的第乙個元素,將其中較小的元素取出放在乙個新的列表中(這樣得到的列表一定是有序的列表)。

/** 

功能:歸併排序
用分治法對arr[low..high]進行二路歸併排序
*/
void mergesort(int arr,int low, int high)
}
/** 

功能:合併兩個序列,組成新的乙個有序序列
思路:
1、使用臨時序列始終保持兩個序列中最小的值
2、將臨時序列的值賦給組合的這個序列
*/
void merge(int arr, int start, int mid, int end)
while (i<=m && j<=n)            // 儲存兩個區間公共長度的最小值
else
temp[k++] = arr[j++];
}
while (i<=m)                    // 儲存第乙個區間剩下的最小值(如果還剩下的話)
while (j<=n)                    // 儲存第二個區間剩下的最小值(如果還剩下的話)
for (i=0; i// 將臨時儲存的值重新賦給輸入陣列
delete temp;                    // 釋放記憶體
temp = null;
}
歸併排序是一種穩定的排序,對於長度為n的檔案,需進行趟二路歸併,每趟歸併的時間為o(n),故其時間複雜度無論是在最好情況下還是在最壞情況下均是o(nlgn)。

歸併排序需要乙個輔助向量來暫存兩個有序子檔案歸併的結果,故其輔助空間複雜度為o(n),顯然它不是就地排序。

歸併排序總結

歸併排序是利用分治思想,分開後一步一步歸併的過程。基本思路就是將陣列分成二組a,b,如果這二組組內的資料都是有序的,那麼就可以很方便的將這二組資料進行排序。可以將a,b組各自再分成二組。依次類推,當分出來的小組只有乙個資料時,可以認為這個小組組內已經達到了有序,然後再合併相鄰的二個小組就可以了。這樣...

歸併排序 總結

歸併排序的思想是把陣列不斷分割成兩半,然後不斷合併,具體就是先遞迴將陣列分成兩半分別排序,然後將結果歸併起來。分割的過程屬於遞迴行為,而合併過程用到了外排序的方法。外排序 用兩個指標指向兩個已排好序的陣列,申請乙個大小為n n為兩個陣列大小的和,n最大為原始陣列的大小 的陣列,把指標指向較小的數放進...

歸併排序總結

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