选择排序~冒泡排序~插入排序~快速排序

public class Sort {

    public static void main(String[] args) {

        int[] arr = new int[]{4, 1, 5, 3, 8, 2, 7, 9, 6};
        Sort sort = new Sort();

        //sort.selectSort(arr);
        //sort.bubbleSort(arr);
        //sort.insertSort(arr);
        sort.quickSort(arr, 0, arr.length - 1);

        for (int i : arr) {
            System.out.print(i + "\t");
        }
    }

    /**
     * 选择排序:
     * 假设第一个为最小值,将其与后面的数依次比较,找出真正最小的值并标记位置
     * 将最小值与原来的最小值位置互换,开始第二轮假设
     */
    public void selectSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int min = arr[i];
            int minIndex = i;//记录最小值的人下标
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < min) {
                    min = arr[j];
                    minIndex = j;
                }
            }
            if (minIndex != i) {
                int temp = arr[i];
                arr[i] = arr[minIndex];
                arr[minIndex] = temp;
            }
        }
    }

    /**
     * 冒泡排序
     * 从后往前冒出每一轮比较的最小值
     */
    public void bubbleSort(int[] arr) {

        for (int i = 1; i < arr.length; i++) {
            for (int j = arr.length - 1; j >= i; j--) {
                if (arr[j] < arr[j - 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;
                }
            }
        }
    }

    /**
     * 插入排序
     * 将下一个元素插入到前面已经排好的队列中
     * 将下一个元素与前面队列的元素一一比较交换至合适的位置
     */
    public void insertSort(int[] arr) {

        for (int i = 1; i < arr.length; i++) {
            for (int j = i - 1; j >= 0; j--) {
                if (arr[j + 1] < arr[j]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                } else {
                    break;
                }
            }
        }
    }

    /**
     * 快速排序
     * 通过一趟排序将要排序的数据分割成独立的两个部分,
     * 一部分的所有数据都小于某个值,另一部分所有的数据都大于某个值,
     * 然后按照此方法对这两部分的数据分别进行快速排序,整个排序的过程可以递归进行,
     * 以此将整个数据变成有序的序列。
     * a:先从数列中取出第一个数作为基准数。
     * b:分区过程中,小于或者等于它的数放在它的左边,将比这个数大的数全放在它的右边,
     * c:再对左右区间重复第二步,直到各个区间只有一个数。
     */
    public void quickSort(int[] arr, int start, int end) {
        if (start >= end) {
            return;
        }
        int i = start;
        int j = end;
        int temp = arr[i];
        while (i != j) {
            while (i < j && arr[j] >= temp) {
                j--;
            }
            if (i < j) {
                arr[i] = arr[j];
            }
            while (i < j && arr[i] <= temp) {
                i++;
            }
            if (i < j) {
                arr[j] = arr[i];
            }
        }
        arr[i] = temp;
        quickSort(arr, start, i - 1);
        quickSort(arr, i + 1, end);
    }
}

猜你喜欢

转载自blog.csdn.net/myCsdn_Xm/article/details/104461778