分治 合併排序 自然合併排序(C )

2021-10-06 11:49:39 字數 1808 閱讀 9084

演算法步驟:(引用自"菜鳥教程")

申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列;

設定兩個指標,最初位置分別為兩個已經排序序列的起始位置;

比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置;

重複步驟 3 直到某一指標達到序列尾;

將另一串行剩下的所有元素直接複製到合併序列尾。

示例圖:

我們需要將序列拆分,將當前區間一分為二,即求中間點;

遞迴地對兩個子區間 l[left…mid] 和 r[mid+1…right] 進行歸併排序(即再次執行第一步);

當拆分後的子串行只含有乙個元素時,將已排序的兩個子區間 l[left…mid] 和 r[mid+1…right] 合併為乙個有序的區間[left…right]。

// 合併排序

#include

using

namespace std;

void

mergesort

(int array,

int left,

int right)

;void

merge

(int array,

int left,

int mid,

int right)

;int

main()

;int len =

sizeof

(array)

/sizeof

(int);

// 陣列長度

mergesort

(array,

0, len-1)

; cout <<

"合併排序:"

;for

(int i =

0;i < len;i++

) cout << array[i]

<<

" ";

cout << endl;

return0;

}void

mergesort

(int array,

int left,

int right)

}void

merge

(int array,

int left,

int mid,

int right)

// 若比較完之後,有序區仍有剩餘元素,則直接複製到temparray陣列中

while

(left_1 <= mid)

temparray[k++

]= array[left_1++];

while

(left_2 <= right)

temparray[k++

]= array[left_2++];

// 將臨時陣列中排序後的元素取出

for(

int i = left, j =

0;i <= right;i++

,j++

) array[i]

= temparray[j]

;// 刪除指標

delete

temparray;

}

程式只是舉例排序,

可以使用cin獲取使用者輸入替代此陣列,對使用者輸入的資料進行排序。

// 待更新。。。
執行截圖(待更新。。。)

自然合併排序

自然合併排序演算法是對合併排序演算法的一種改進。設 a 0 n 1 是無序陣列,用一次對陣列a的掃瞄可以找出其中 自然排好序的子陣列,然後將相鄰的排好序的子陣列段兩 兩合併,繼續合併相鄰排好序的子陣列段,直至將整個數 組排好序。code include include using namespace...

自然合併排序

我們知道歸併排序是將乙個無序的陣列兩兩劃分,最終劃分成每個組內有序的子元素,組後再將若干個組內有序的元素合併成乙個完整有序的陣列。這個思路可以使用遞迴和非遞迴演算法來實現,我在此主要講自然合併排序 自然合併排序當然也是合併排序,所謂的自然只不過就是指 所劃分的子陣列不在是兩兩劃分,而是每乙個子陣列都...

自然合併排序演算法

合併排序基本思想 將待排序元素分成大小大致相同 可以不等長 的兩個子集和,分別對兩個子集合進行排序,最終將排好序的子集合合併成所要求的排好序的集合。遞迴版 void mergesort int a,int left,int right void mergepass int x,int y,int s...