1.算法思想
通过一趟排序将要排序的数据分割成独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分数据分别进行快速排序,
整个排序过程可以递归进行,以此达到整个数据变成有序序列。
2.算法代码
public class quickSort { public static void main(String[] args) { int a[] = {8, 1, 3, 5, 2}; quicksort(a); for (int k = 0; k < a.length; k++) { System.out.println(a[k]); } } public static void quicksort(int arr[]){ //进行排序算法 sort(arr,0,arr.length-1); } public static void sort(int arr[],int low,int high){ if(low<high){ //找到中间那个数 int mid = partition(arr,low,high); //排序左边的 sort(arr,low,mid-1); sort(arr,mid+1,high); } } public static int partition(int arr[],int left,int right) { //做基准点 int temp = arr[left]; while (left < right) { //从后向前找找比基准小的 while (left < right && arr[right] > temp){ right = right-1; } //交换位置 arr[left] = arr[right]; //从前向后找比基准大的 while (left < right && arr[left] < temp){ left = left + 1; } //交换位置 arr[right] = arr[left]; } //将基准数据放到位置 arr[left] = temp; //返回基准点 return left; } }
3.时间复杂度
最差情况:当数组原本就按从小到大顺序排列时:
10 20 30 40 50 60 70 80 第一轮比较,将10分别与20、30、...、80比较,共比较n-1次
第二轮比较,将20分别与30、...、80比较,共比较n-2次
....
共比较(n-1)+(n-2)+...+1次,即时间复杂度为O(n方),与冒泡排序时间复杂度一样
一般情况:时间复杂度为O(nlogn) 需要复杂的数学证明
4.参考博客
https://cloud.tencent.com/developer/article/1486381?from=15425
https://www.bilibili.com/video/BV1WF41187Bp