演算法導論 歸併排序

2021-08-31 09:20:06 字數 1421 閱讀 9113

歸併排序的步驟分為三個:將問題分解為更小的問題,然後解決小問題,將小問題合併為大問題的解。針對歸併排序的主要思想是:將乙個需要排序的陣列一分為二,然後將這兩部分進行單獨排序,然後將這兩個排好序的子數組合然後按照順序合併為大陣列。還有乙個就是邊界問題,將陣列無限的分下去知道最後的子陣列只剩乙個元素的時候也就是終止的時候,因為乙個元素的陣列,我們認為它就是排好序的。

下面是c++的實現**:

歸併排序從原始陣列開始

void merge_sort(int *array, int n)
中間的merge_range是對大陣列進行的分解,然後最開始的if判斷語句是這個分解的終止條件。

void merge_range(int *array, int start, int end)
最重要的部分就是將兩個排好序的子陣列合併為乙個大陣列,其主要的步驟就是,將兩個部分的陣列拷貝兩個新的陣列中,然後將這兩個陣列從小到大地填到大陣列,這裡有個技巧就是,兩個排好序的陣列都用探針慢慢往後移,當有乙個移動到最後的時候,我們可以通過檢查是否到結尾來判斷,這樣另乙個子陣列的元素就可以填補到大陣列中了,唯一避免這種麻煩的判斷,我們在新陣列中分別都加了乙個元素代表哨兵,用了int的最大值表示無窮大,這裡就可以按照普通的判斷來結束。

void merge(int *array, int start, int mid, int end)

left_array[i] = std::numeric_limits::max();

for(j = 0; j <= end - mid - 1; j++)

right_array[j] = std::numeric_limits::max();

i = 0;

j = 0;

while(start <= end)

}

通過乙個main函式,然後增加了一些輸出,得到下面結果:

int main()

; merge_sort(array, array_length);

}

[0-0] : [ 5 ]

[1-1] : [ 2 ]

[0-1] : [ 2 5 ]

[2-2] : [ 4 ]

[3-3] : [ 7 ]

[2-3] : [ 4 7 ]

[0-3] : [ 2 4 5 7 ]

[4-4] : [ 1 ]

[5-5] : [ 3 ]

[4-5] : [ 1 3 ]

[6-6] : [ 2 ]

[7-7] : [ 6 ]

[6-7] : [ 2 6 ]

[4-7] : [ 1 2 3 6 ]

[0-7] : [ 1 2 2 3 4 5 6 7 ]

演算法導論 歸併排序

public class mergesort mergesort data,0,中間 mergesort data,中間,最後 merge data,0,最後 system.out.println 排序前 for int i 0 i9 i 10 0 system.out.println system...

演算法導論 歸併排序

演算法的設計有很多思想,之前的插入排序使用的是增量的方法,即在排好的子陣列a中,將元素a j 插入,形成新的子陣列a。這次將實現另一種排序 歸併排序,歸併排序採用了 分治法 divide and conquer 本篇中包含 分治法,也可以稱為分治策略 是將乙個大規模的問題 原問題 劃分成n個規模較小...

演算法導論 歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。歸併操作 merge 指的是將兩個已經排序的序列合併成乙個序列的操作。對兩個排序陣列合併成乙個有序陣列,這個很簡單 public int merge int a,int...