一、概念
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
时间复杂度:O(nlog2^n)
空间复杂度:O(log2^n)
稳定性:不稳定
二、算法描述
**基本思想**:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
三、伪代码实现(中间值为基准值)
public class Main{
/**
* 比较类排序:快排
*/
public static void quickSort(int num[], int l, int r){
int i = l;
int j = r;
//1.取中间值为基准值
//2.只有当两个指针交叉后才算一趟快排完毕,所以当i == j时,还需要比较一次,num ={1, 2, 3, 5, 8, 4, 7}就是一个例子
while(i <= j){
//3.从左边开始找比基准值大的索引
//4.从右边开始找比基准值小的索引
//5.找到一个大于基准值、一个小于基准值的索引后,并且两个索引还没有交叉,可以相等
if(i <= j){
//6.交换两个的值,左边指针指向下一个,右边指针指向前一个
}
}
//这时的(l~j)的数组小于或者等于基准值和(i~r)的数组大于或者等于基准值(通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所 有数据都比另外一部分的所有数据都要小)
//7.if(l<j)递归快排(l~j)的数组
//8.if(i<r)递归快排(i~r)的数组
}
}
四、代码实现(中间值为基准值)
public class Main{
/**
* 比较类排序:快排
*/
public static void quickSort(int num[], int l, int r){
int i = l;
int j = r;
//1.取中间值为基准值
int mid = num[l + (r - l)/2];
while(i <= j){
//3.从左边开始找比基准值大的索引
while(num[i] < mid){
i++;
}
//4.从右边开始找比基准值小的索引
while(num[j] > mid){
j --;
}
if(i <= j){
//6.交换两个的值,并且左边指针指向下一个,右边指针指向前一个
int temp = num[i];
num[i] = num[j];
num[j] = temp;
i ++;
j --;
}
}
//不能提取下面的方式 例子:4568789
//if(i == j){
// i ++;
// j --;
//}
//这时的(l~j)的数组小于等于基准值和(i~r)的数组大于等于基准值
//7.if(l<j)递归快排(l~j)的数组
if (l <= j) {
quickSort(num, l, j);
}
//8.if(i<r)递归快排(i~r)的数组
if (i <= r) {
quickSort(num, i, r);
}
}
}
五、代码实现(任意基准值实现)
六、快排优化
https://www.cnblogs.com/noKing/archive/2017/11/29/7922397.html