基本思想,通过一趟排序将待排数组分成两个部分,其中一部分的所有元素都比另一部分的要小,然后对这两个部分继续分别进行排序,直到整个待排数组都变成有序数列。
时间复杂度:O(nlogn) 、空间复杂度:O(nlogn)
算法描述
快速排序使用分治法将一个串分成两个串(子列表),具体步骤:
1、每次排序都会选取数组中的一个元素当做基准数。
2、基准数一般会选取数组最左边的数。 然后从两边开始进行检索,
首先从右边开始检索比基准数小的元素,然后停下。
其次从左边开始检索比基准数大的元素,检索到就停止。
然后交换两个数,继续检索
3、递归的把小于基准元素的子数列和大于基准元素的子数列进行排序。
步骤
1、首先将数组的第一个元素当做基准数 base=6
2、先移动右指针 j ,向左移动找到第一个小于base=6的数 即 5 ,停止j指针的移动
然后再移动左指针 i ,向右移动找到第一个大于base的数 即 7 ,停止i指针的移动
然后交换两个数
3、重复步骤2。
4、i和j相遇后便停止移动,将基准数与相遇的位置的数交换位置
5、第一次排序完成 得到的有序数列左边 的数都小于基准数base=6,右边的数都大于base
6、以后先排基准数左边再排基准数右边,方式和第一轮排序一致
代码
public class QuickSort {
public static void main(String[] args) {
int[] arr={12,34,65,3,4,2,1,78,100,89,56};
quickSort(arr,0,arr.length-1);
for(int e:arr){
System.out.println(e);
}
}
/**
* @Description: 快速排序
* @Param: [arr 待排数组, left 待排数列的左坐标, right 待排数列的右坐标]
* @return: [int[], int, int]
* @Author: Kwg
* @Date: 2022/1/8
*/
public static void quickSort(int[] arr,int left,int right){
//递归出口
if (left>=right){
return;
}
int l=left;
int r=right;
int base=arr[left];
//循环条件
while(l!=r){
//首先右指针向前便利,寻找比基准数小的数,遇到比基准数小的数就停止
//循环条件一定要有用l<r
while(arr[r]>=base&&l<r){
r--;
}
//左指针向右遍历,寻找比基准数大的数,遇到比基准书大的数就停止
//这里的循环条件必须是 <= 否则的话左指针第一个遍历都过不去
while(arr[l]<=base&&l<r){
l++;
}
//交换两个数
int temp=arr[l];
arr[l]=arr[r];
arr[r]=temp;
}
//将基准数与两指针相遇的数交换位置,第一次排序结束
arr[left]=arr[l];
arr[l]=base;
//递归
quickSort(arr,left,l-1);
quickSort(arr,l+1,right);
}
}