演算法學習(排序二)歸併排序

2021-08-02 23:54:57 字數 675 閱讀 3572

歸併排序所採用的思想是分治法,即:分解 ->解決->合併

假設面對乙個無序的陣列,如,將其分解為左右兩個陣列,但此時這兩個陣列還是無序的,因此,還需要進一步的分解,經過若干步之後,分解後如下所示

, , , , , , , , ,

當每個陣列中僅有乙個元素的,可以認為此陣列是有序的,接下來,這些陣列兩兩合併,最後乙個組合成乙個完整的有序陣列

/**

array陣列中,left到mid和mid+1到right的部分都是已經排序好的,該函式的作用是將其重新排列為順序陣列

@param array 需要排序的陣列

@param left 左邊座標

@param mid 中間座標

@param right 右邊座標

*/void merges (int *array, int left, int mid, int right)

else

}}/**

該函式的作用是分解乙個陣列

@param array 需要分解的陣列

@param left 左邊座標

@param right 右邊座標

*/void mergesort (int *array, int left, int right)

}

排序演算法學習 歸併排序

歸併排序 merge sort 採用分治思想,將排序的過程分成乙個個子過程,當所有子過程完成時,排序也最終完成了。而歸併排序是將陣列不斷地二分,進而形成乙個個子過程。子過程,即歸併的過程如下圖演示,需要額外開闢一片空間進行複製乙份原陣列,然後兩邊逐一進行比較後進行歸併。至於它的時間複雜度,我們可以看...

演算法學習之二 歸併排序

將陣列分為兩半,將每部分遞迴的應用歸併排序,直至不能分解為止。在兩部分都排好序後,對它們進行歸併。用圖說明 這裡涉及到遞迴,有點不好理解 當將乙個length為8的陣列拆分為兩半 左陣列和右陣列。只要左邊陣列長度不為1,就還要拆分,那就遞迴呼叫,直到長度為1,同理,右邊陣列也是如此的拆分。等拆分好的...

遞迴演算法學習(歸併排序)

歸併排序是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半子表合併成為越來越大的有序序列,歸併排序包括兩個步驟,分別為 1 劃分子表 2 合併半子表 首先我們來討論歸併演算法,歸併演算法將一系列資料放到乙個向量中,索引範圍為 first,las...