快速排序算法核心思想是:将小于基准点的元素放到基准点的左边,将大于基准点的元素放到基准点的右边。经过过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,让所有的数据变成有序的
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分,一般先选取第一个元素。
int low=left;
int high=right;
int mid=arr[low];
(2)从右边的下标寻找比参考值小的数的下标位置, 如果右边的都比参考值大 不交换 右边追踪变量向左递减
while(low<high&&arr[high]>=mid) high--;
如果没有找到比参考值小的 则high==low了 交换也不影响
将low下标位置的值修改成 寻找到的比参考值小的数 即arr[low]=arr[right]
arr[low]=arr[right];
(3)从左边下标位置寻找比参考值大的数的下标位置, 如果左边低位的都比参考值小 不交换 左边追踪变量向右递增 继续寻找
while(low<high&&arr[low]<=mid) low++;
如果在low下标的右边没有找到比参考值大的 则high==low了 交互也不影响
将high下标位置值修改成 寻找到的比参考值大的数 即arr[right]=arr[low]
arr[right]=arr[low];
(4)运行到这里 low就到了中间位置 因为low>=right 包括已经排好序的 并将中间位置赋值为参考值 此时 low左边是小于参考值的 右边是大于参考值的 然后继续下一次循环,
arr[low]=mid;
quickSort(arr,left,low-1);
quickSort(arr,low,right-1);
参考代码如下:
public class MyClass {
public static void main(String[] args){
int[] arr=new int[]{6,35,13,4};
quickSort(arr,0,arr.length-1);
for(int j:arr){
System.out.print(j+",");
}
}
public static void quickSort(int[] arr,int left,int right){
if(left>right)return;
int low=left;
int high=right;
int mid=arr[low];
while(low<high){
//从右边的高位下标寻找比参考值小的数的下标位置, 如果右边高位的都比参考值大 不交换 high--
while(low<high&&arr[high]>=mid) high--;
//如果没有找到比参考值小的 则high==low了 交换也不影响
//将low下标位置的值修改成 寻找到的比参考值小的数 即arr[low]=arr[right]
arr[low]=arr[right];
//从左边下标位置寻找比参考值大的数的下标位置, 如果左边低位的都比参考值小 不交换 low++
while(low<high&&arr[low]<=mid) low++;
//如果在low下标的右边没有找到比参考值大的 则high==low了 交互也不影响
//将high下标位置值修改成 寻找到的比参考值大的数 即arr[right]=arr[low]
arr[right]=arr[low];
}
/**
* 运行到这里 low就到了中间位置 因为low>=right 包括已经排好序的
* 并将中间位置赋值为参考值 此时 low左边是小于参考值的 右边是大于参考值的
* 然后继续下一次循环
*/
arr[low]=mid;
if (low-1>left) quickSort(arr,left,low-1);
//if (low<right-1) quickSort(arr,low,right-1);
if (low+1<right) quickSort(arr,low+1,right);
}
}
复杂度分析:
快排平均复杂度O(nlogn) :可以参考博客:
相关图文 可以参考博客: