快速排序+图文讲解+视频讲解+java代码实现
1.图文讲解
2.视频讲解
3.java代码实现
/**
* @program: soword-finger-offer
* @description:
* @author: long
* @create: 2020-06-11 10:13
**/
public class QuickSort {
public static void main(String[] args) {
//int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
int[] arr = {2,4,5,7,1,3};
quickSort(arr, 0, arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void quickSort(int arr[], int low, int hight){
//递归终止条件
if(low > hight) return;
//定义变量 两个哨兵 一个基点
int i = low , j = hight,temp = arr[low];
//基数如果取的最左边,循环中每次需要j从最右边向左边行;基数取右边,则i先从最左边向右行
while(i<j){
//j先向左边行。 找出右边比基数小的值
while(arr[j] >= temp && i<j) j--;//找出右边小于基数的数组 与左边交换,如果右边数字大于基数 就j-- 一直向左边走
// i<j 可以防止 j-- 在 arr[j] >= temp一直存在的情况下,j--出现越界的问题。
//i后向右行。找出左边比基数大的值
while(arr[i] <= temp && i < j) i++;
/* 默认代码是将数组 从小到大排 如果需要从大到小 可以在最后反转 或者 改成如下代码
while(arr[j] <= temp && i<j) j--;
while(arr[i] >= temp && i < j) i++; //两个内层的while循环 大于小于符号互换一下
*/
//交换跳出循环的 arr[i] 和 arr[j]
if(i<j){
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}
}
//跳出整个循环,i=j 交换基数 arr[low] 和 arr[i] 交换 temp = 2 =arr[low] 已经做了一步交换
// temp = arr[low] arr[low] = arr[i], arr[i] = tmp; 三步交换
arr[low] = arr[i];
arr[i] = temp;
//递归调用左边数组
quickSort(arr,low,j-1);// i = j 这两步递归可以 i j的值可以随便换
//递归右边数组
quickSort(arr,j+1,hight);
}
}
4.复杂度分析
1. 如何证明快速排序的平均复杂度为O(nlogn)
2. 算法导论快速排序分析
- 先上结论:
- 最坏:O(n^2)
- 平均:O(nlogn)