算法-快速排序

算法-快速排序

开始撸常用算法

理解快速排序算法

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

以下为代码逻辑


 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;
    }

你可能感兴趣的:(算法)