算法-快速排序

算法-快速排序

开始撸常用算法

理解快速排序算法

快速排序是冒泡排序的一种改进;通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列;
将画图展示快速排序算法的逻辑
有一组数据如下
在这里插入图片描述
这里我们将指定一个key,这个key默认可以为最后一个数据也可以为第一个数据,本分析使用的是第一个数据作为key;
为了保证key的随机性,可以生成一个left+1到right之间的一个随机数,然后将第一个数据与随机数下标对应的数据进行交换例如
我们生产了一个随机数4他对应的数值就位6
如下图
在这里插入图片描述
进行交换数据
在这里插入图片描述
注意我们每一次对数组进行快速排序时都生产一个随机数进行交换
开始快速排序:
由于我们确定的key是第一个数据,那么他开始比较的第一个指针就为right;如果我们确定的第一个key为最后一个数据,那么我们最开始比较的第一个指针就为left
如图,快速排序就是将key与数据比较,将大于key的放在一边,将小于key的就放在另一边,下面我们演示将大于key的放在右边,将小于key的放在左边;
在这里插入图片描述
在这里插入图片描述
如果比较完一侧进行了转换,就换到另一个指针,这里换到left
left即为刚才转换掉的1,1比6小不需要变换left++,指针后移
在这里插入图片描述
同理
在这里插入图片描述
在这里插入图片描述
一直到left指针为下标4,8比6大进行转换
在这里插入图片描述
在这里插入图片描述
同理比较为left并进行了转换,指针就切到right
在这里插入图片描述
在这里插入图片描述
同样逻辑
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时left不大于right,就将key放入此位置
在这里插入图片描述
然后左右两个数组再进行快速排序逻辑即可,也就是递归
在这里插入图片描述
同理还是要随机生成随机数与left进行调换
在这里插入图片描述
在这里插入图片描述
然后变成如下,继续快速排序
在这里插入图片描述
在这里插入图片描述
最后排序完成

以下为代码逻辑


 public static void quickSort(int [] args,int left ,int right){
       if(left<right){
           swapChange(args,new Random().nextInt(right-left+1)+left,right);
           int  pivot=partition(args,left,right);
           quickSort(args,left,pivot-1);
           quickSort(args,pivot+1,right);
       }
    }


    public static int partition(int [] args,int left,int right){
        int base=args[left];//左边为基数,先比较右边与基数
        while (right>left){
            while (right>left&&args[right]>=base){
               right--;
            }
            args[left]=args[right];
            while (right>left&&args[left]<=base){
                left++;
            }
            args[right]=args[left];
        }
        args[left]=base;
        return left;
    }

    public static void swapChange(int[] args,int i,int j){
        int temp=args[i];
        args[i]=args[j];
        args[j]=temp;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值