算法-快速排序
开始撸常用算法
理解快速排序算法
快速排序是冒泡排序的一种改进;通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列;
将画图展示快速排序算法的逻辑
有一组数据如下
这里我们将指定一个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;
}