美文网首页
冒泡排序 优化 和选择排序,快速排序

冒泡排序 优化 和选择排序,快速排序

作者: Alien28 | 来源:发表于2019-04-16 16:28 被阅读0次
/**
     * 冒泡排序  蛮力法 (n<5)比其他排序快
     * <p>
     * 时间复杂度 n*(n-1)/2   n²/2  n   0(n²)
     * 空间复杂度    O(1)
     */
    @Test
    public void bubbleSort() {
        int[] array = {8, 4, 3, 1, 5, 2, 6, 7, 9};
        for (int j = 0; j < array.length - 1; j++) {
            boolean flag = true;
            for (int k = j + 1; k < array.length; k++) {
                if (array[j] > array[k]) {
                    int i = array[k];
                    array[k] = array[j];
                    array[j] = i;
                    flag = false;
                }
            }
            if (flag) {
                break;
            }
        }
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + "--");
        }
        System.out.print("\n");
    }

    /**
     * 选择排序
     * <p>
     * 时间复杂度  0(n²)
     * 空间复杂度    O(1)
     */
    @Test
    public void selectSort() {
        int[] array = {8, 4, 3, 1, 5, 2, 6, 7, 9};
        for (int j = 0; j < array.length - 1; j++) {
            int index = j;
            for (int k = j + 1; k < array.length; k++) {
                if (array[index] > array[k]) {
                    index = k;
                }
            }
            if (index != j) {//交换位置
                array[index] = array[index] ^ array[j];
                array[j] = array[index] ^ array[j];
                array[index] = array[index] ^ array[j];
            }
        }
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + "--");
        }
        System.out.print("\n");
    }

    /**
     * 快速排序
     * <p>
     * 时间复杂度O(nlogn)
     *
     * @param array 排序的数组
     * @param begin 开始的位置
     * @param end   结束的位置
     */
    private void quickSort(int[] array, int begin, int end) {
        if (end - begin <= 0) {
            return;
        }
        int x = array[begin];
        int low = begin;
        int high = end;
        //由于会从两头取数据,需要一个方向
        boolean direction = true;
        L1:
        while (low < high) {
            if (direction) {//从右往左找
                for (int i = high; i > low; i--) {
                    // 如果 右面数据小于定义的中间数,则把该数移动到 定义的中间数的位置
                    if (array[i] <= x) {
                        //移动之后 低指针右移
                        array[low++] = array[i];
                        high = i;
                        direction = !direction;
                        continue L1;
                    }
                }
                high = low;//如果上面的if从未进入,让两个指针重合
            } else {
                for (int i = low; i < high; i++) {
                    // 如果 右面数据小于定义的中间数,则把该数移动到 定义的中间数的位置
                    if (array[i] >= x) {
                        //移动之后 低指针右移
                        array[high--] = array[i];
                        low = i;
                        direction = !direction;
                        continue L1;
                    }
                }
                low = high;//如果上面的if从未进入,让两个指针重合
            }
        }
        //把最后找到的值,放入中间位置
        array[low]=x;
        //开始完成左右两边的操作(遍历)
//        quickSort(array,begin,low-1);
//        quickSort(array,low+1,end);
    }

相关文章

网友评论

      本文标题:冒泡排序 优化 和选择排序,快速排序

      本文链接:https://www.haomeiwen.com/subject/bxobwqtx.html