歸併排序的實現

2021-06-18 06:20:30 字數 1139 閱讀 6601

歸併排序的時間複雜度和快排還有堆排序是一樣的,歸併排序利用了分治的思想,它的核心就是將兩個有序的陣列合併,那麼我們怎麼得到這兩個有序的陣列呢,就是將這兩個陣列再分為小的陣列,由小的陣列合併而成,是不是有種遞迴的趕腳?對了,歸併就是,遞迴+合併

演算法的框架像這樣的:

自己實現的**如下:

/****************merge_sort.c made by cfmlovers************/

#include #define arraysize 4

merge_array(int a, int l, int mid, int r, int temp)

while(i <= mid)

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

while( j <= r)

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

for(i = 0; i < k; i++)

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

}void merge_sort(int a, int l, int r, int temp)

}void main()

既然說是遞迴演算法,那麼我們可不可以用非遞迴實現呢?答案是肯定的

剛才說遞迴利用了分治的思想,我們的遞迴框架中先把整個陣列分為兩個部分,然後在各個部分繼續分為兩個部分,就像上面的那張,分到最後只剩乙個數的陣列的時候就是有序的了,然後向上合併,每一次都是合併有序的陣列,這是乙個自上而下分治,然後合併的過程

那麼非遞迴如何實現呢?其實是乙個逆過程,我們可以自下而上分治,然後合併

**實現如下:

void merge_sort(int a, int length, int *temp)}}

貴並排序的時間分為兩個部分,分治,類似乙個二分法查詢,時間複雜度o(logn),合併的時候時間是o(n),總的時間就是o(nlogn),是乙個穩定的排序演算法,

最差,平均,最好時間都是o(nlogn)

歸併排序實現

1,我認為歸併排序是分治思想的運用,先是把要排序的數列分成兩半,分別對這兩半進行歸併排序,一步步分下去,當分到規模為1時,開始合併兩個已經有序的陣列。2,主要的 是兩個已經有序的陣列的合併,其中涉及的有空間申請的問題和哨兵的使用。具體看 這是初寫的 存在的問題有每次迭代都申請了空間且沒釋放,而且沒有...

歸併排序實現

看到個帖子寫的歸併排序,記錄一下,特別是對鍊錶的使用。歸併的排序分為三步走 1 分割,2 遞迴,3 合併。陣列歸併排序 歸併排序三步走 1 分割子問題 2 遞迴 3 合併子問題。include stdafx.h includeusing namespace std void mergearray i...

歸併排序實現

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另...