適合面試手擼的排序演算法實現

sayWhat_sayHello發表於2018-11-28

前言

各種排序的實現方式很多,每種排序針對資料狀態,時間複雜度等等這裡不講。只給程式碼。起因大概是我當時想找一篇好點的彙總文章找不到。適合手擼。例如考官讓你手擼一下快排之類的。

交換

private static void exch(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

測試程式碼

public static void main(String[] args){
        int[] arr = {1,9,8,6,2,4,7,5,5};
        sort(arr);
        System.out.println(Arrays.toString(arr));
}

選擇排序

public void selectSort(int[] arr){
    for(int i = 0;i < arr.length;i++){
        int min = i;
        for(int j = i+1;j < i;j++){
            if(arr[min] > arr[j]){
                exch(arr,min,j);
            }
        }
    }
}

插入排序

private static void sort(int[] arr){
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < i; j++) {
            if (arr[j] > arr[i]) {
                exch(arr,i,j);
            }
        }
    }
}

氣泡排序

private static void sort(int[] arr){
    for (int i = arr.length - 1; i > 0; i--) {
        for (int j = 0; j < i; j++) {
            if (arr[j] > arr[j + 1]) {
                exch(arr,j,j+1);
            }
        }
    }
}

歸併排序

private static void sort(int[] arr) {
    sort(arr,0,arr.length-1);
}
private static void sort(int[] arr, int lo, int hi) {
    if (lo >= hi) {
        return;
    }
    int mid = lo + ((hi - lo) >> 1);
    sort(arr,lo,mid);
    sort(arr,mid+1,hi);
    merge(arr, lo,hi);
}
private static void merge(int[] arr, int lo, int mid,int hi) {
    int[] helper = new int[hi - lo + 1];
    int i = lo;
    int j = mid + 1;
    int index = 0;
    while (i <= mid && j <= hi) {
        helper[index++] = (arr[i] < arr[j] ? arr[i++] : arr[j++]);
    }
    while (i <= mid){
        helper[index++] = arr[i++];
    }
    while (j <= hi){
        helper[index++] = arr[j++];
    }
    for (int k = 0; k < helper.length; k++) {
        arr[lo + k] = helper[k];
    }
}

快速排序

    private static void sort(int[] arr) {
        if(arr == null || arr.length < 2){
            return;
        }
        sort(arr,0,arr.length - 1);
    }

    private static void sort(int[] arr, int lo, int hi) {
        if (lo >= hi) {
            return;
        }
        exch(arr,lo+(int)(Math.random()*(hi-lo+1)),hi);//打亂
        int[] p = partition(arr, lo, hi);
        sort(arr,lo,p[0]-1);
        sort(arr,p[1]+1,hi);
    }

    private static int[] partition(int[] arr, int lo, int hi) {
        int less = lo - 1;
        int more = hi;
        while (lo < more){
            if(arr[lo] < arr[hi]){
                exch(arr,++less,lo++);
            }else if (arr[lo] > arr[hi]){
                exch(arr,--more,lo);
            }else {
                lo++;
            }
        }
        exch(arr,more,hi);
        return new int[]{less+1,more};
    }

相關文章