萌新初步了解快速排序算法

  • 排序算法原理
    填坑思想以及分区思想:
    1、拿到一个无序数组,首先确定基准数,一般拿第一个数作为基准数。把基准数拿出来比较,就有了个坑位,即坑位从基准数位置开始
    2、然后从数组最右侧开始往左比较,找到第一个比基准数小的,此位置创造一个坑位,把比基准数小的这个数放到上一个坑位中,也就是基准数占的那个坑啦
    3.接着从所填坑位开始往右比较,找到第一个比基准数大的,此位置创造一个坑位,并把数填到上一个空的坑位,就又多出来一个坑位啦
    4.继续在所填坑位往左查找,看有没有比基准数小的没有经过填坑的,有的话继续上面操作,直到最后一个坑位左边比基准数小,右边比基准数大,最后一个坑位放入基准数
    5.基准数所在位置索引为分区索引,分区左边都比基准数小,右边都比基准数大,再将分区进行递归排序。
    啊~好抽象-_-|||

  • 直接上代码

  public void quickSort(int[] arr, int start, int end) {


    //判断起始索引小于尾索引
    if(start < end) {

        //获取分区索引
        int index = getIndex(arr,start, end);
        //左侧递归,所有数比基准数小
        quickSort(arr, 0, index - 1);
        //右侧递归,所有数比基准数大
        quickSort(arr, index + 1, end);
        }
    } 

//填坑思想具体实现
    private int getIndex(int[] arr, int start, int end) {

        int i = start;
        int j = end;

        //获取基准数
        int x = arr[i];

        while(i < j) {

            //右侧思想,往左比较比基准数小的数进行填坑换位
            //比基准数大的跳过
            while(i < j && arr[j] > x) {
                j--;
            }
            //比基准数小的换位
            if(i < j) {
                arr[i] = arr[j];
                i++;
            }

            //左侧思想, 往右比较找比基准数大的换位

            //比基准数小的跳过
            while(i < j && arr[i] < x) {
                i++;

            }

            //比基准数大的换位
            if(i < j) {
                arr[j] = arr[i];
                j--;
            }


        }

        //最后未填坑的填基准数
        arr[i] = x;

        //返回基准数所在位置索引
        return i;

    }  
  • 测试结果
public static void main(String[] args) {

        int[] arr = {5, 7, 8, 1, 6};

        quickSort(arr, 0, arr.length - 1);
        for(int i : arr) {
            System.out.println(i);
        }
    }

这里写图片描述

  • 总结
    快速排序相对冒泡排序比较难理解,萌新的我也花了很长时间才转过来,还是要多练习

猜你喜欢

转载自blog.csdn.net/weixin_37711738/article/details/81661577