快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成了两个部分。
这种思路就叫做分治法。
元素的移动
选定了基准元素以后,我们要做的就是把其他元素当中小于基准元素的都移动到基准元素一边,大于基准元素的都移动到基准元素另一边。
挖坑法:
import java.util.Arrays;
public class QuickSort {
public static void quickSort(int startIndex , int endIndex ,int [] arr){
//递归结束条件
if (startIndex >= endIndex){
return;
}
//得到基准元素的位置
int pivotIndex= partition(arr, startIndex, endIndex);
//分治
quickSort(startIndex,pivotIndex-1,arr);
quickSort(pivotIndex+1,endIndex,arr);
}
public static int partition(int [] arr,int startIndex,int endIndex){
//基准元素
int povot = arr[startIndex];
int left = startIndex;
int right = endIndex;
//基准元素下标
int index = startIndex;
//大循环在左右指针交互时结束
while (right >= left){
//right指针从右向左比较
while (right >= left){
if (arr[right] < povot){
arr[left]= arr[right];
index = right;
left++;
break;
}
right --;
}
//left指针从左向右比较
while (right >= left){
if (arr[left] > povot){
arr[right] = arr[left];
index = left;
right--;
break;
}
left++;
}
}
arr[index] = povot;
return index;
}
public static void main(String[] args) {
int arr[] = new int[] {5,7,6,5,3,2,8,1};
quickSort(0,arr.length-1,arr);
System.out.println(Arrays.toString(arr));
}
}
快速排序的平均时间复杂度是 O(nlogn),最坏情况下的时间复杂度是 O(n^2)