第一周打卡:A-快速排序

实现快速排序算法的关键在于在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移动到数组的左边,比选择的数字大的数字移动到数组的右边。一般选择序列的第一个元素。具体实现如下:

    public static void quickSort(int[] array, int low, int high) {
        if (array == null || low < 0 || high >= array.length) throw new IllegalArgumentException("Invalid  Parameters");
        int i, j, index, temp;
        if (low > high) return;

        i = low;
        j = high;
        //temp为基准位
        index = array[low];

        while (i < j) {
            //先看右边,依次往左递减
            while (index <= array[j] && i < j) {
                j--;
            }
            //再看左边,依次往右递增
            while (index >= array[i] && i < j) {
                i++;
            }
            //如果满足条件则交换
            if (i < j) {
                temp = array[j];
                array[j] = array[i];
                array[i] = temp;
            }

        }
        //最后将基准位与i和j相等位置的数字交换
        array[low] = array[i];
        array[i] = index;
        //递归调用左半数组
        quickSort(array, low, j - 1);
        //递归调用右半数组
        quickSort(array, j + 1, high);
    }

    public static void main(String[] args) {
        int[] array = {10, 7, 2, 4, 7, 62, 3, 4, 2, 1, 19};
        quickSort(array, 0, array.length - 1);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }

过程示意图如下所示:
在这里插入图片描述
快速排序每次的交换是跳跃式的,这样交换的次数就少了,速度也就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度是O(N^2),平均时间复杂度是O(NlogN)。最差的情况下空间复杂度是O( N ) ,即退化为冒泡排序的情况,最优的情况下空间复杂度是O(logN),即每一次都平分数组的情况。

猜你喜欢

转载自blog.csdn.net/weixin_44331516/article/details/88687157