歸併排序
要點:
- 基於分治的思想,將需要比較的數組分爲左右兩部分。
- 自頂向下進行分組,知道lo >= hi時,開始遞歸出棧。
- 將出棧後的數組依次進行遞歸,藉助一個輔助數組aux對數組結果臨時儲存
- 歸併操作
- 從開頭和中間兩個位置向左遍歷
- 當左半部分已經到頭,只須將右半部分輔助數組的數據賦值給原數組的對應位置
- 右半部分到頭同理
- 當左半部分的值大於右半部分,則用右半部分的值進行賦值;右半部分同理
- 這樣保證歸併後的數組,左半部分始終是較小值;而右半部分始終是較大值
代碼實現
// 根據實際的數組安排其大小
int[] aux;
public static void sort(int[] arr, int lo, int hi){
if(lo >= hi) return;
int mid = (lo + hi) / 2;
// 對兩部分分別進行排序
sort(arr, lo, mid);
sort(arr, mid+1, hi);
merge(arr, lo, mid, hi);
}
public static void merge(int[] arr, int lo, int mid, int hi){
//注意兩個都是從左至右遍歷,所以j從mid+1開始,一直遍歷到h結束
int i = lo, j = mid + 1;
// 複製數組
for(int k = lo; k <= hi; k++)
aux[k] = arr[k];
for(int k = lo; k <= hi; k++){
// 左邊已經到頭了
if(i > mid) arr[k] = aux[j++];
else if(j > hi) arr[k] = aux[i++];
// 如果右邊的比左邊小,則交換位置
else if(aux[i] > aux[j]) arr[k] = aux[j++];
else arr[k] = aux[i++];
}
}