歸併排序:學習記錄

歸併排序

要點:

  • 基於分治的思想,將需要比較的數組分爲左右兩部分。
  • 自頂向下進行分組,知道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++];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章