常见的排序算法--java版

个人总结的常见的排序算法

public class Sort {
    // 1、冒泡:稳定,最优O(n) 最差O(n^2) 平均O(n^2)
    private static void sort1(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                }
            }
        }
    }
    // 2、选择:不稳定,最优O(n^2) 最差O(n^2) 平均O(n^2)
    private static void sort2(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int tmp = arr[j];
                    arr[j] = arr[i];
                    arr[i] = tmp;
                }
            }
        }
    }
    // 3、插入:稳定,最优O(n) 最差O(n^2) 平均O(n^2)
    private static void sort3(int[] arr) {
        int insertData = 0;
        for (int i = 0; i < arr.length; i++) {
            insertData = arr[i];
            int j = i - 1;
            while (j >= 0 && insertData < arr[j]) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = insertData;
        }
    }
    // 4、希尔:不稳定,最优O(n) 最差O(n^1.5) 平均O(n^1.5)
    private static void sort4(int[] arr) {
        int space = arr.length;
        while (space > 1) {
            space = space / 2;
            for (int i = 0; i < space; i++) {
                for (int j = i + space; j < arr.length; j = j + space) {
                    int insertData = arr[j];
                    int k = j - space;
                    while (k >= i && insertData < arr[k]) {
                        arr[k + space] = arr[k];
                        k = k - space;
                    }
                    arr[k + space] = insertData;
                }
            }
        }
    }
    // 5、快速:不稳定,最优O(nlogn) 最差O(n^2) 平均O(nlogn)
    private static void sort5(int[] arr, int start, int end) {
        int left = start;
        int right = end - 1;
        int pivot = arr[end];
        while (left < right) {
            if (arr[left] < pivot) {
                left++;
                continue;
            }
            if (arr[right] > pivot) {
                right--;
                continue;
            }
            swap(arr, left, right);
            left++;
            right--;
        }
        if (arr[left] < pivot) {
            left++;
        }
        swap(arr, left, end);
        if (left - 1 > start)
            sort5(arr, start, left - 1);
        if (left + 1 < end)
            sort5(arr, left + 1, end);
    }
    private static void swap(int[] arr, int x, int y) {
        int tmp = arr[x];
        arr[x] = arr[y];
        arr[y] = tmp;
    }
    // 6、归并:稳定,最优O(nlogn) 最差O(nlogn) 平均O(nlogn)
    public static void sort6(int[] arr, int low, int high) {
        int mid = (low + high) / 2;
        if (low < high) {
            sort6(arr, low, mid);
            sort6(arr, mid + 1, high);
            merge(arr, low, mid, high);
        }
    }
    public static void merge(int[] arr, int low, int mid, int high) {
        int[] temp = new int[high - low + 1];
        int i = low;// 左指针
        int j = mid + 1;// 右指针
        int k = 0;
        // 把较小的数先移到新数组中
        while (i <= mid && j <= high) {
            if (arr[i] < arr[j]) {
                temp[k++] = arr[i++];
            } else {
                temp[k++] = arr[j++];
            }
        }
        // 把左边剩余的数移入数组
        while (i <= mid) {
            temp[k++] = arr[i++];
        }
        // 把右边边剩余的数移入数组
        while (j <= high) {
            temp[k++] = arr[j++];
        }
        // 把新数组中的数覆盖nums数组
        for (int k2 = 0; k2 < temp.length; k2++) {
            arr[k2 + low] = temp[k2];
        }
    }
    // 7、堆:不稳定,最优O(nlogn) 最差O(nlogn) 平均O(nlogn)
    private static void sort7(int[] arr) {
 
    }
    // 测试
    public static void main(String[] args) {
        int[] array = { 10, 8, 24, 32, 7, 6, 100, 55, 43, 21, 56, 55, 10000,
                3000 };
        // sort1(array);
        // sort2(array);
        // sort3(array);
        // sort4(array);
        // sort5(array,0,array.length-1);
        sort6(array, 0, array.length - 1);
        System.out.println(Arrays.toString(array));
    }
}