首先,快速排序解决了在nlogn时间复杂度下解决排序问题,由于减少了元素的移动,实际比归并排序还要快。
主要是分治思想,先切分(partition),切分这个函数做了什么事,选择一个基准值,把小于它的,放在它的左边,大于它的放在它的右边,最后再把partiton放在合适的中值上,再return 位置回去 。
再分别从这个切分位置,再分别递归排序。
快速排序精髓: 一个是切分,一个是递归。
同时,快速排序的切分,能处理很多情况下的问题。通过切分把小于它的放左边,大于它的放右边。
public static void sortss(int[] arr) {
sortss(arr, 0,arr.length - 1);
}
private static void sortss(int[] arr, int startIndex,int endIndex) {
if (endIndex <= startIndex) {
return;
}
//切分
int pivotIndex = partitions(arr,startIndex,endIndex);
sortss(arr,startIndex,pivotIndex-1);
sortss(arr,pivotIndex+1,endIndex);
}
private static int partitions(int[] arr,int startIndex,int endIndex) {
int pivot = arr[startIndex];//取第一个元素为基准值
while(startIndex<endIndex){
while(startIndex<endIndex && arr[endIndex]>=pivot){
endIndex--;
}
swaps(arr,startIndex,endIndex);
while(startIndex<endIndex && arr[startIndex]<=pivot){
startIndex++;
}
swaps(arr,startIndex,endIndex);
}
return startIndex;
}
public static void swaps(int[] arr,int l,int r){
int temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
}
public static void print(int[] arr){
for(int a:arr){
System.out.print(a);
}
}
c++板子
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j)
{
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}