*我是一个从汽车行业转行IT的项目经理,我是Edward,如想了解更多,请关注我的公众号【转行项目经理的逆袭之路】。今天想跟大家聊聊快排,快速排序是我很早就很感兴趣的一种排序,时空复杂度低,递归,有代表性,但是代码相对复杂,理解起来不那么容易,最常见的两种算法是单轴和双轴,各有优缺点,不过万变不离其宗。
经过进一步的研究分析后,对之前的分类进行一下修改,本文提到的两种都只能算是单轴 ,一种是单指针,一种是双指针。至于真正Arrays.sort里用到的双轴快排,是非常复杂的,以后会分享对源码的分析。 *
单指针快排
package algorithm;
import java.util.Arrays;
/**
* single pointer quick sort right
* @author EP
* @date 2020年4月11日
* @version 1.0
*/
public class QuickSort_Single {
public static void sort(int[] arr) {
sort(arr, 0,arr.length - 1);
}
private static void sort(int[] arr, int startIndex, int endIndex) {
if (endIndex <= startIndex) {
return;
}
//切分
int pivotIndex = partition(arr, startIndex, endIndex);
sort(arr, startIndex, pivotIndex-1); //递归
sort(arr, pivotIndex+1, endIndex);
}
private static int partition(int[] arr, int startIndex, int endIndex) {
int pivot = arr[startIndex];//取基准值
int mark = startIndex;//mark初始化为起始下标
for(int i=startIndex+1; i<=endIndex; i++){
//单边扫描
if(arr[i]<pivot){
//小于基准值 则mark+1,并交换位置。 大于基准值 则没有操作。
mark ++;
int p = arr[mark];
arr[mark] = arr[i];
arr[i] = p;
}
}
//基准值与mark对应元素调换位置
arr[startIndex] = arr[mark];
arr[mark] = pivot;
return mark;
}
public static void main(String args[]) {
int[] arr = {
3, 5, 1, 7, 2, 9, 8