一、排序演算法的分類

  1. 選擇排序(直接選擇排序堆排序
  2. 交換排序(氣泡排序快速排序
  3. 插入排序(直接插入排序希爾排序
  4. 歸併排序
  5. 桶式排序
  6. 基數排序

二、歸併排序的原理

歸併排序利用的是分治的思想實現的,對於給定的一組資料,利用遞迴與分治技術將資料序列劃分成為越來越小的子序列,之後對子序列排序,最後再用遞迴方法將排好序的子序列合併成為有序序列。合併兩個子序列時,需要申請兩個子序列加起來長度的記憶體,臨時儲存新的生成序列,再將新生成的序列賦值到原陣列相應的位置。

三、歸併排序的實現


public class MergeSort {

    public static void merSort(int[] arr,int left,int right){

        if(left<right){
            int mid = (left+right)/2;
            merSort(arr,left,mid);//左邊歸併排序,使得左子序列有序
            merSort(arr,mid+1,right);//右邊歸併排序,使得右子序列有序
            merge(arr,left,mid,right);//合併兩個子序列
        }
    }
    private static void merge(int[] arr, int left, int mid, int right) {
        int[] temp = new int[right - left + 1];//ps:也可以從開始就申請一個與原陣列大小相同的陣列,因為重複new陣列會頻繁申請記憶體
        int i = left;
        int j = mid+1;
        int k = 0;
        while(i<=mid&&j<=right){
            if (arr[i] < arr[j]) {
                temp[k++] = arr[i++];
            } else {
                temp[k++] = arr[j++];
            }
        }
        while(i<=mid){//將左邊剩餘元素填充進temp中
            temp[k++] = arr[i++];
        }
        while(j<=right){//將右序列剩餘元素填充進temp中
            temp[k++] = arr[j++];
        }
        //將temp中的元素全部拷貝到原陣列中
        for (int k2 = 0; k2 < temp.length; k2++) {
            arr[k2 + left] = temp[k2];
        }
    }
    public static void main(String args[]){
        int[] test = {9,2,6,3,5,7,10,11,12};
        merSort(test,0,test.length-1);
        for(int i=0; i<test.length;i++){
            System.out.print(test[i] + " ");
        }
    }

}

測試結果

2 3 5 6 7 9 10 11 12