前言
当我们要对成万上亿的数进行排序的时候,我们不免需要消耗一定的时间。那些复杂度为n2的排序方式将有着非常大的计算量。那有没有一种复杂度为n且效率很高的排序方式呢。当然有----快速排序。它的效率非常之高,空间复杂度也比较简答。
原理
快速排序的原理就是先选定一个pivot(基值),在每一轮的排序中将比pivot小的元素放在pivot左,大的放在pivot右侧,并产生新的pivot进行下一轮的比较。(一般选最左侧的元素为基值)
例如 6 3 2 9 7 我选最左侧的基值pivot=6
第一轮的作用就是将基值左侧放小于基值的元素,右侧放大基值的元素。
即 第二轮应该是这样 3 2 6 9 7
第二轮就是确立原基值左侧和右侧新的基值
对着两侧进行第二轮的快排
左侧3 2
右侧9 7
快排之后就为
左侧3 2
右侧7 9
合并就为2 3 6 7 9
代码实现
public void quickSort(int [] array,int left,int right){
int l,r,temp,pivot;
l=left;
r=right;
//当l<r的时候才执行,如不加此句将会一直迭代递归导致内存溢出
if (l>r){
return;
}else {
pivot = array[left];//首先让最左侧的数为基值
}
while (l<r){//当l<r的时候循环比较
//先从右侧开始比较
while (array[r]>pivot&&l<r){ //当右侧的值大于基值继续移动,一直到遇到比pivot小的停止
r--;
}
//再从右侧比较
while (array[l]<pivot&&l<r){//当左侧的值小于基值继续移动,一直遇到比pivot大的停止
l++;
}
//然后两者交换
if (l<r){
temp=array[l];
array[l]=array[r];
array[r]=temp;
}
}
//确定下一轮新的基值
int temp1=array[l];
array[l]=pivot;
pivot=temp1;
//确定下一轮新的基值
quickSort(array,left,l-1);//对原基值左侧进行快排
quickSort(array,l+1,right);//对原基值右侧进行快排
System.out.println(Arrays.toString(array));
}
随笔
以上就是本人对快排的一些理解,如果有理解错误请指正。