快速排序(java版)

快速排序时间复杂度是O(nLog2n),待排序列越接近无须,本算法效率越高。最坏是O(n^2),待排序列越接近有序效率越低。平均是O(nLog2n),与初始序列有关。

空间复杂度是O(nLog2n),因为需要栈的支持。

假设我们现在对“6  1  2  7  9  3  4  5 10  8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列:

3  1  2  5  4  6  9  7  10  8

在初始状态下,数字6在序列的第1位。我们的目标是将6挪到序列中间的某个位置,假设这个位置是k。现在就需要寻找这个k,并且以第k位为分界点,左边的数都小于等于6,右边的数都大于等于6。想一想,你有办法可以做到这点吗?

方法其实很简单:分别从初始序列“6  1  2  7  9  3  4  5 10  8”两端开始“探测”。先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们。这里可以用两个变量i和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”。刚开始的时候让哨兵i指向序列的最左边(即i=1),指向数字6。让哨兵j指向序列的最右边(即=10),指向数字。

094811yilrz1tkzkvlrriz.png

首先哨兵j开始出动。因为此处设置的基准数是最左边的数,所以需要让哨兵j先出动,这一点非常重要(请自己想一想为什么)。哨兵j一步一步地向左挪动(即j--),直到找到一个小于6的数停下来。接下来哨兵i再一步一步向右挪动(即i++),直到找到一个数大于6的数停下来。最后哨兵j停在了数字5面前,哨兵i停在了数字7面前。

095430axy0qkhxxkktkktk.png

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是快速排序Java代码: ```java public class QuickSort { public static void quickSort(int[] arr, int left, int right) { if (left < right) { int pivot = partition(arr, left, right); // 分区操作,返回 pivot 的索引 quickSort(arr, left, pivot - 1); // 对左边进行递归排序 quickSort(arr, pivot + 1, right); // 对右边进行递归排序 } } private static int partition(int[] arr, int left, int right) { int pivot = left; // 设定基准值(pivot) int index = pivot + 1; for (int i = index; i <= right; i++) { if (arr[i] < arr[pivot]) { swap(arr, i, index); index++; } } swap(arr, pivot, index - 1); return index - 1; } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] arr = {10, 7, 8, 9, 1, 5}; int n = arr.length; quickSort(arr, 0, n-1); System.out.println("排序后的数组:"); for (int i : arr) { System.out.print(i + " "); } } } ``` 注释及解释: - `quickSort` 方法:实现快速排序算法。参数 `arr` 为待排序数组,`left` 和 `right` 为待排序区间的左右端点(初始值为数组的起始和终止下标)。 - `partition` 方法:实现分区操作,即将数组中小于基准值的元素放在基准值的左边,大于等于基准值的元素放在基准值的右边。参数 `arr` 为待排序数组,`left` 和 `right` 为待排序区间的左右端点(初始值为数组的起始和终止下标)。 - `swap` 方法:实现数组中两个元素的交换。参数 `arr` 为待排序数组,`i` 和 `j` 分别为两个元素的下标。 - `main` 方法:测试快速排序算法。先定义一个待排序数组 `arr`,然后调用 `quickSort` 方法对其进行排序,最后输出排序后的数组。 运行结果: ``` 排序后的数组: 1 5 7 8 9 10 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值