快速排序
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分所有数据要小,然后按照此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
排序原理:
-
在数组中选一个基准数(通常为数组第一个);
-
将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边;
-
对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序。
需求:
排序前:{6,1,2,7,9,3,4,5,8}
排序后:{1,2,3,4,5,6,7,8,9}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jK3gi9MH-1612087487353)(C:\Users\29455\AppData\Roaming\Typora\typora-user-images\1612086581380.png)]
代码实现:
public class QuickSort {
public static void quickSort(int[] arr,int low,int high){
int i,j,temp,t;
if(low>high){
return;
}
i=low;
j=high;
//temp就是基准位
temp = arr[low];
while (i<j) {
//先看右边,依次往左递减
while (temp<=arr[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (temp>=arr[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = temp;
//递归调用左半数组
quickSort(arr, low, j-1);
//递归调用右半数组
quickSort(arr, j+1, high);
}
public static void main(String[] args){
int[] arr = {6,1,2,7,9,3,4,5,8};
quickSort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
}
运行结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
快速排序时间复杂度分析
根据代码我们知道,每一层的递归操作次数为该次递归所传入的元素个数,忽略每次减去的枢轴(1个元素并没有给到下一层,但是每层这里减掉一个常数对复杂度的分析影响不大,所以暂时忽略),即:
第1层是n次,
第2层有2次递归,每次n/2次,共n次操作,
第3层有4次递归,每次n/4次,共n次操作,
……
(最后一层)第k层有k次递归,每次n/2^(k-1)次,共n次操作
由于递归结束的条件是只有一个元素,所以这里的n/2^(k-1)=1 => k=logn+1
即递归树的深度为logn
)次,共n次操作
由于递归结束的条件是只有一个元素,所以这里的n/2^(k-1)=1 => k=logn+1
即递归树的深度为logn
时间复杂度=每层的操作次数*树的深度=nlogn 即:O(nlgn);