算法-快速排序

  1. 动态图

快速排序的核心思想是分治法,分而治之。它的实现方式是每次从序列中选出一个基准值,其他数依次和基准值做比较,比基准值大的放右边,比基准值小的放左边,然后再对左边和右边的两组数分别选出一个基准值,进行同样的比较移动,重复步骤,直到最后都变成单个元素,整个数组就成了有序的序列。

简单概括如下:

从数列中挑出一个元素,称为 “基准”(pivot);

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

/**
     * 功能描述 : 快速排序(重复性操作 且有终止条件就可以考虑用 递归)
     *
     * 用到了:双指针算法(不需要开辟额外空间)
     *       难点: 两个元素之间互换位置(用了双指针算法)
     *
     * @author guoyiguang
     * @date 2023/1/6
     * @param
     * @return
     */
    public int[]  quickSort(int[] array ,int  start ,int end){
        //                11,4,8,2,10     以 8 为分区点
        //                11,4,   8,   2,10

        //                2,4,   8,   11,10

        //  i 从 4 开始向右移动 ,同时 j 从 10 开始向左移动,i 小于8 的就继续右移动 , j 大于 8 继续左移动

        //  当 i 大于 8 停止,j 小于 8 j也停止,然后这两个元素  互换位置

        if(start == end ){
            return array;
        }


        int middle = (start+end)/2 ;


        int middleValue = array[middle];

        // middle  = 3
        //   3,4  value 11 ,10
        for(int i = start ; i <= middle ; i++){
            if(array[i] >= middleValue){
                //
                for (int j = end ; j >= middle ; j--){
                    if(array[j] < middleValue){
                        // 数组两元素交换位置
                        int tem  =  array[i] ;
                        array[i] = array[j];
                        array[j] = tem ;
                    }
                }
            }
        }


       // 左边
        quickSort(array,start,middle);
        // 右边
        quickSort(array,middle+1,end);

        return array;





    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值