目录
一、理解快速排序的本质
快排,说白了就是给基准找正确索引位置。
快速排序基于分治法,属于交换排序,是不稳定排序算法。
二、快速排序的基本步骤
(1)选择基准(Pivot):
从数组中选择一个元素作为基准。
(2)分区(Partition):
将数组分为两部分,所有小于基准的元素移到基准的左边,所有大于基准的元素移到基准的右边。具体步骤:
-
设置两个指针,一个在起始位置(左指针),一个在结束位置(右指针)。
-
移动左指针,直到找到一个大于等于基准值的元素。
-
移动右指针,直到找到一个小于等于基准值的元素。
-
如果左指针仍在右指针左侧,则交换这两个元素,然后继续移动指针。
-
当左指针超过右指针时,停止。此时,右指针所在位置即为基准值的最终位置。
(3)递归调用:
然后对基准元素左边和右边的元素重复(1)和(2)步骤,直到每个子数组的大小为1或0,即数组已经有序。
(4)合并:
当递归完成后,所有子数组都变为有序,整个数组也就有序了。
三、partion一次划分的详细过程
四、代码实现
public class Test {
public static void main(String[] args){
int arr[] = {56,55,26,98,64,32,58,64,25};
qSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void qSort(int[] arr,int low, int high){
// 跳出递归条件
if(low >= high){
return;
}
// 帮助基准找到正确的索引
int pivot = partion(arr,low,high);
qSort(arr, low, pivot -1);
qSort(arr,pivot+1,high);
}
public static int partion(int[] arr, int low, int high){
int pivot = arr[low]; // 取第一个元素为基准元素
while(low<high){
// 右边找小
while(low<high && arr[high]>=pivot){
high--;
}
arr[low] = arr[high]; // 比基准小的移到左边
// 左边找大
while(low<high && arr[low] < pivot){
low++;
}
arr[high] = arr[low]; // 比基准大的移到右边
}
// 当low = high时,此时找到pivot的正确索引
arr[low] = pivot;
return low;
}
}