演算法步驟:(引用自"菜鳥教程")
申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列;
設定兩個指標,最初位置分別為兩個已經排序序列的起始位置;
比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置;
重複步驟 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...