快速排序

今天说一说快速排序

什么是快速排序:
快速排序是对冒泡排序的一种改进算法 因为冒泡排序需要每次都对相邻的两个数进行比较 显然非常浪费时间,而快速排序之所以这么叫 当然是因为它快了

快速排序也使用的分治法 类似于归并 并且是在冒泡的基础上 可以说集两种算法的优点
我理解的快速排序也可以说是 “分区”的方法

快速排序的思路

  • 首先找到一个基准值(pivot)
  • 然后在利用两个指针 一个在左 一个在右 向中间搜索
  • 当左指针遇到比基准值小的停止 当右指针遇到比基准值大的停止
  • 然后交换两个元素的位置 使这个基准值处于数列的中间位置
  • 之后开始递归 不断的寻找基准值并把其放置在数列中间 直到排序完成

引入五分钟算法图 演示

代码如下

//快速排序
    public int[] fastSort(int[] sourceArray){
        // 对 arr 进行拷贝,不改变参数内容
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
        return quickSort(arr, 0, arr.length - 1);
    }

    //开启排序
    private int[] quickSort(int[] arr, int left, int right) {
        if (left < right) {
            int partitionIndex = partition(arr, left, right);
            //开始递归 将基准值处中间位置把数组分区
            quickSort(arr, left, partitionIndex - 1);
            quickSort(arr, partitionIndex + 1, right);
        }
        return arr;
    }

    //分区
    private int partition(int[] arr, int left, int right) {
        // 设定基准值(pivot)
        int pivot = left;
        int index = pivot + 1; //计数器
        //从基准值下一个元素开始遍历
        for (int i = index; i <= right; i++) {
            //当元素小于基准值 则调换位置
            if (arr[i] < arr[pivot]) {
                swap(arr, i, index);
                index++;
            }
        }
        swap(arr, pivot, index - 1);
        return index - 1;
    }
    //交换两个元素
    private void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

posted @ 2022-07-05 19:46  Cloong  阅读(43)  评论(0)    收藏  举报