排序

寫在前面:冒泡排序和快速排序,選擇交換排序和堆排序
  1. 交換類
package sort;

/**
 * Create by IDEA
 * User: zhangqi
 * Date: 2019/4/7
 * Desc: 排序公共方法類
 */
public class MySort {

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

}

  1. 冒泡排序
package sort;

/**
 * Create by IDEA
 * User: zhangqi
 * Date: 2019/4/7
 * Desc: 冒泡排序
 */
public class BubbleSort {

    public static void main(String[] args) {
        int[] arr = {5, 3, 6, 2, 8, 1, 9, 7};
        bubbleSort(arr);
        for (Integer i : arr) {
            System.out.print(i);
            System.out.print(" ");
        }
    }


    public static int[] bubbleSort(int[] arr) {

        if (arr == null || arr.length == 0) return arr;
        int length = arr.length;
        for (int i = 0; i < length - 1; i++) {
            for (int j = length - 1; j > i; j--) {
                if (arr[j] > arr[j - 1]) MySort.swap(arr, j, j - 1);
            }
        }
        return arr;
    }
}

  1. 快速排序
package sort;

/**
 * Create by IDEA
 * User: zhangqi
 * Date: 2019/4/9
 * Desc: 快速排序
 */
public class QuickSort {

    public static void main(String[] args) {
        int[] arr = {50, 10, 90, 30, 70, 40, 80, 60, 20, 12, 23, 43, 21};
        quickSort(arr, 0, arr.length - 1);
        for (Integer i : arr) {
            System.out.print(i);
            System.out.print(" ");
        }
    }

    /**
     * 遞歸排序
     * @param arr
     * @param low
     * @param high
     */
    private static void quickSort(int[] arr, int low, int high) {

        if (arr == null || arr.length == 0) return;

        if (low < high) {
            int temp = index(arr, low, high);

            quickSort(arr, low, temp - 1);

            quickSort(arr, temp + 1, high);
        }
    }

    /**
     * 局部調整,返回座標地址
     * @param arr
     * @param low
     * @param high
     * @return
     */
    private static int index(int[] arr, int low, int high) {

        int point = arr[low];
        while (low < high) {
            while (high > low && arr[high] >= point)
                high--;
            MySort.swap(arr, low, high);
            while (high > low && arr[low] <= point)
                low++;
            MySort.swap(arr, low, high);
        }
        return low;
    }


}

  1. 簡單選擇排序
package sort;

/**
 * Create by IDEA
 * User: zhangqi
 * Date: 2019/4/7
 * Desc: 簡單選擇排序
 */
public class SelectSort {

    public static void main(String[] args) {
        int[] arr = {5, 3, 6, 2, 8, 1, 9, 7};
        selectSort(arr);
        for (Integer i : arr) {
            System.out.println(i);
        }
    }

    public static int[] selectSort(int[] arr) {

        if (arr == null || arr.length == 0) return arr;
        int length = arr.length;
        for (int i = 0; i < length - 1; i++) {
            for (int j = i + 1; j < length; j++) {
                if (arr[i] > arr[j]) MySort.swap(arr, i, j);
            }
        }
        return arr;
    }
}

  1. 堆排序
package sort;

/**
 * Create by IDEA
 * User: zhangqi
 * Date: 2019/4/7
 * Desc: 堆排序
 */
public class HeapSort {

    public static void main(String[] args) {
        int[] arr = {50, 10, 90, 30, 70, 40, 80, 60, 20, 12, 23, 43, 21};
        heap(arr);
        for (Integer i : arr) {
            System.out.print(i);
            System.out.print(" ");
        }
    }


    public static void heap(int[] arr) {

        if (arr == null || arr.length == 0) return;
        int length = arr.length;
        /** 堆結構是完全二叉樹,假如結點數目爲n(n>1),則n/2及其以內的都是非葉子結點 */
        for (int i = length / 2; i > 0; i--) {
            heapTop(arr, i, length - 1);
        }
        /** 首尾交換,繼續將餘下的數據調整爲堆結構 */
        for (int j = length - 1; j > 0; j--) {
            MySort.swap(arr, 0, j);
            heapTop(arr, 1, j);
        }
    }

    /**
     * 將完全二叉樹調整爲堆結構
     * @param arr
     * @param s
     * @param length
     */
    private static void heapTop(int[] arr, int s, int length) {

        for (int j = 2 * s; j <= length; j = 2 * s) {
            if (j < length) {
                if (arr[j - 1] < arr[j]) ++j;
            }
            if (arr[s - 1] < arr[j - 1]) {
                int temp = arr[s - 1];
                arr[s - 1] = arr[j - 1];
                arr[j - 1] = temp;
                s = j;
            } else {
                break;
            }
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章