阿浪的算法之路----------快速排序
众所周知,排序算法包括冒泡、插入、归并、二分、快排,堆排等等,其中快速排序我觉得可能是面试的时候遇到频率最高的了,经常会有面试官上来就是手撕快速排序,以此来考验面试者的基本功,所以趁着今天周末下午有空,好好学习一下,记录下来以便日后学习使用
快速排序在网上的各种教程数不胜数,此次尽量以自己能看懂的思路记录下来。
快速排序有两个关键字:“快速” 和 “排序”,从名字上看来这种排序算法相对于其他的排序算法最大的特点就是快速,它的时间复杂度最好的情况下是O(n logn),最坏的情况下是O(n2),相对于可能大家都熟悉的冒泡排序的平均时间复杂度O(n2),确实是快了很多。
快速排序一个最主要的实现也是使用了分治法和双指针的思想。双指针我前几天有记录过一篇文章
使用左右指针解决快速排序首先对于需要排序的数组中,任意取出一个数当做基准数(Key),以及定义指向最左边元素的left和指向最右边元素的right。
定义一个数组{33,22,66,44,21,56,77,34,21,10,35}
对于这个数组,基准数:33,left = 33,right = 35,;(ps:原谅我自己不会画图)
第一次排序,第一步先从最右边找寻第一个比33小的数,并且将这个数放到left指向的位置。
10,22,66,44,21,56,77,34,21,33,35
left right 基准数为33 left = 10,right = 33
第二步,再从最左边找寻第一个比33大的数,并且将这个数放到right指向的位置
10,22,33,44,21,56,77,34,21,66,35
left right
基准数为33 left = 33,right = 66
这样循环下去直到 left和right相遇,第一次排序才算结束。第一次排序后数组为
10,22,21,21,33,56,77,34,44,66,35
left 基准数为33 left = right = 33
right
此时根据分治思想,将数组从33 分为 左右两个数组,数组1和数组2,这两个继续上述过程中的排序
数组1: 10,22,21,21
数组2: 56,77,34,44,66,35
具体代码算法如下
package fromtoday;
/**
* @description: 分治思想加双指针解决快速排序
* @author: zhanghailang
* @date: 2020/11/1 0001 16:50
*/
import java.util.Arrays;
public class QuickSortSolution {
public static void main(String[] args) {
quickSort(new int[]{39,28,55,87,66,3,17,39});
}
public static void quickSort(int[] arr){
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr,int left,int right){
int middle;
if(left < right){
middle = partition(arr,left,right);
quickSort(arr,left,middle-1);
quickSort(arr,middle+1,right);
}
}
public static int partition(int[] arr,int left,int right){
int pivot = arr[left];
while(left < right){
while(left<right && arr[right] >= pivot)
right--;
arr[left] = arr[right];
while(left < right && arr[left]<= pivot)
left++;
arr[right] = arr[left];
}
arr[left] = pivot;
return left;
}
}
感觉我在本地从typora修改完再导入进来的排版会有很大问题。我本地typora的展示是这样的:
为啥导入进来之后感觉极其的丑陋呢。。。