演算法回顧之歸併排序c 實現

2021-10-09 23:12:03 字數 1958 閱讀 7153

二、**總結

同樣,這裡我們以乙個亂序陣列為例。有陣列 a[5]

a[0]

a[1]

a[2]

a[3]

a[4]32

710len = 5

startindex = 0

endindex = n - 1 = 5 - 1 = 4

歸併排序的中心思路可以概括為從區域性有序到整體有序。具體來說,就是可以將原陣列進行分割(分治),分別進行運算(遞迴),實現區域性有序,然後通過乙個外排進而實現整體有序

結合a[5],就是先將陣列切成兩半

然後進行區域性的排序,並借助兩個指標實現外排(借助輔助陣列,a和b中的較小值填入輔助陣列,並且右移,直到其中乙個指標遍歷了其所在的子陣列的全部元素,結束並將另外的陣列的剩餘元素全部拷貝到輔助陣列),進而實現整體有序。(這裡僅展示了第一次分治的過程,實際上伴隨著遞迴,子陣列也會被再一次分治,外排,直到無法進行分割,直觀來說,就是輔助陣列被構建了logn次)

最後將輔助陣列資料拷貝到原陣列即可。

時間複雜度分析:

#include

#include

using

namespace std;

void

merge

(vector<

int>

&v,int start,

int mid,

int end)

//拷貝剩餘的資料到輔助陣列

while

(p1 <= mid)

while

(p2 <= end)

//資料拷貝

for(i =

0; i < temp.

size()

; i++)}

void

sortprocess

(vector<

int>

&v,int start,

int end)

int mid = start +

((end - start)

>>1)

;sortprocess

(v, start, mid)

;sortprocess

(v, mid +

1, end)

;//合併

merge

(v, start, mid, end);}

void

mergesort

(vector<

int>

&v)//分插

sortprocess

(v,0

, v.

size()

-1);

}int

main()

;for

(int i =

0; i < v.

size()

; i++

) cout << endl;

mergesort

(v);

for(

int i =

0; i < v.

size()

; i++

) cout << endl;

system

("pause");

return0;

}

筆者在回顧的時候,這段編碼還是錯誤挺多次的,主要問題出現在merge函式部分,即輔助陣列構建時候出了問題,究其原因,主要是對遞迴的理解不到位。總結來講,歸併排序的各個階段不難理解,但是當這些內容串聯起來是容易犯一些錯誤。

排序演算法C 實現之歸併排序詳解

將一組無序陣列變為有序 文中暫定為 陣列 向量 先考慮兩個有序向量如何合併成為乙個新的有序向量 我們可以認為任務目標想獲得的有序向量是由有序向量a和b組成,其中有序向量a又是由兩個有序向量a1和a2組成,對b a1 a2繼續往下分,直到向量中元素個數為1,此時,該向量自然是有序的。這就是在遞迴 這就...

排序演算法之歸併排序及C 實現

歸併排序思想 將原陣列拆成前後兩半,遞迴地對前半部分和後半部分分別執行排序過程,再將排好序的前後兩部分合併。典型的分治問題,而分治一般用遞迴去解。歸併排序也是基於比較的排序。歸併排序穩定。template typename t void merge t arr,int l,int m,int r,t...

歸併排序演算法實現(C )

歸併操作 merge 也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作 1 i 3 1 6 8 38 100 202 301 4 根據例子實現的演算法為 include using namespace std int a void merge array int a,int n,int...