快速排序
最近在面试题中经常看到说要手写一个快排,但是好久不接触都有些生疏,今天又复习了一遍
快速排序的实现方式
个人对于快速排序的理解是,通过设定一个基准数,找到这个基准数的在整个数组中适合的位置,即基准数的左边都小于这个基准数,基准数的右边都大于这个基准数。
在这个时候,基准数左边和右边并不是有效的排序,只是统一的都大于或小于基准数,然后我们就可以更换基准数,然后通过递归的方式直接把这个数组进行有效的排序
借用一张看到的别的大佬发的图qwq:
快速排序的复杂度分析
- 时间复杂度
快速排序的平均时间复杂度是:O(nlogn) - 空间复杂度
最优的情况下空间复杂度为:O(logn) ;每一次都平分数组的情况
最差的情况下空间复杂度为:O( n ) ;退化为冒泡排序的情况
Java代码的实现
public class QuickSort {
public static void main(String[] args) {
int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
quickSort(arr, 0, arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
private static void quickSort(int[] arry,int left,int right){
if (left>right){
return;
}
int base=arry[left];
int i=left;
int j=right;
while (i<j){
//从右边开始递减
while (arry[j]>=base&&i<j){
j--;
}
//回到左边递减
while (arry[i]<=base&&i<j){
i++;
}
//如果这两种情况都出现了,则会进行到这里,就把两个数交换
int t=arry[j];
arry[j]=arry[i];
arry[i]=t;
}
//然后跳出这个循环,把base的值更新,这里就相当于一个arry[left]和arry[i]的交换
arry[left]=arry[i];
arry[i]=base;
//递归调用
quickSort(arry,left,i-1);
quickSort(arry,j+1,right);
}
}