目录
递归实现快速排序
原理
分治法核心步骤
选择基准值(Pivot)
从数组中选一个元素作为基准值(如最右侧元素、中间元素或随机元素)。分区(Partition)
将数组分为两部分:左侧:所有元素 小于等于 基准值。
右侧:所有元素 大于等于 基准值。
基准值最终位于正确的位置(排序后的最终位置)。
递归排序子数组
对左右子数组递归执行上述步骤,直到子数组长度为 1 或 0(已有序)。
以下面这一组数字为例
第一步
找一个基准值,这里以46为基准
从后面往前找比基准值小的交换,从前面找比基准值大的交换。
1.发现 7比46小,然后7现在就排在第一个。
2.从前面找比46大的,找啊找,找到了94比46大,我们就把94放到原来7的位置,94也就是基准值的位置了,这样就完成了第一步。
第二步
经过第一步已经找到基准值的位置,从这里开始进行递归,对基准值左边与右边分别进行递归排序,直到排序完成。
代码
下面是递归代码展示:
import java.util.Arrays;
/**
* 快速排序
* 先确定一个基准点
* 将比基准值小的放在基准值左边,比基准值大的放在右边
* 递归进行
* 从后往前找比基准值小的并交换
* 从前往后找比基准值大的并交换
*/
public class FastSort {
public void sort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int pivot = arr[left];
int i = left;
int j = right;
while (i < j) {
while (i < j && arr[j] > pivot) {
j--;
}
if (i < j) {
arr[i] = arr[j];
i++;
}
while (i < j && arr[i] < pivot) {
i++;
}
if (i < j) {
arr[j] = arr[i];
j--;
}
}
arr[i] = pivot;
sort(arr, left, i - 1);
sort(arr, i + 1, right);
}
public static void main(String[] args) {
int arr[] = {46, 5, 3, 94, 2, 6, 7};
FastSort f = new FastSort();
System.out.println("排序前" + Arrays.toString(arr));
f.sort(arr, 0, arr.length - 1);
System.out.println("排序后" + Arrays.toString(arr));
}
}
结果页不出所料
时间复杂度
快速排序的平均时间复杂度为O(nlogn),但最坏情况下也可以达到O(n2)。