快速排序 (Quick Sort)(Java实现)

快速排序(Quicksort)是对冒泡排序的一种改进,借用了分治的思想,由C. A. R. Hoare在1962年提出。

1、基本思想

快速排序的基本思想:挖坑填数+分治法。

首先选一个轴值(pivot,也有叫基准的),通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

在这里插入图片描述

2、算法描述

快速排序使用分治策略来把一个序列(list)分为两个子序列(sub-lists)。步骤为:

  1. 从数列中挑出一个元素,称为"基准"(pivot)
  2. 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作
  3. 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序

递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

在这里插入图片描述

3、代码实现

用伪代码描述如下:

  1. i = L; j = R; 将基准数挖出形成第一个坑a[i]
  2. j–,由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中
  3. i++,由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中
  4. 再重复执行②,③二步,直到i==j,将基准数填入a[i]中
    在这里插入图片描述

3.1 递归实现

/**
 * 快速排序(递归)
 *
 * ①. 从数列中挑出一个元素,称为"基准"(pivot)。
 * ②. 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
 * ③. 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。
 * @param arr   待排序数组
 * @param low   左边界
 * @param high  右边界
 */
public static void quickSort(int[] arr, int low, int high){
   
    if(arr.length <= 0) return;
    if(low >= high) return;
    int left = low;
    int right = high;

    int temp = arr[left];   
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序是一种常见的排序算法,也是Java常用的排序算法之一。它的原理是在数组中选定一个数作为基准值,然后将小于该值的数放在左边,大于该值的数放在右边,以此类推,直到数组被分成的每个子序列都有序为止。 Java实现快速排序的关键在于递归。首先需要定义一个快速排序的方法,该方法接收待排序的数组、左边界和右边界为参数,然后递归调用自身对左右两边的子序列进行排序。在方法内部先取基准值,然后进行分区操作,将小于基准值的数放在左边,大于基准值的数放在右边。最后,递归调用快速排序方法对左右子序列进行排序。 快速排序的优点是时间复杂度为O(nlogn),是所有内部排序算法中平均时间复杂度最优的,适用于大规模数据排序;缺点是在最坏情况下时间复杂度为O(n^2),所以算法的效率与选取的基准值有关。实际中,通常采用随机选取基准值或者选取三数取中等方式来避免最坏情况的发生。 代码实现如下: ``` public static void quickSort(int[] arr, int left, int right) { if (left >= right) { return; } int pivot = arr[left]; // 选定基准值 int i = left, 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; // 将基准值放回中间位置 quickSort(arr, left, i - 1); // 左边子序列递归排序 quickSort(arr, i + 1, right); // 右边子序列递归排序 } ``` 在代码中,left表示数组左边界,right表示数组右边界,pivot表示基准值。在分区操作中,i和j分别指向左右两端,先从右边开始寻找小于基准值的数,再从左边寻找大于等于基准值的数,交换两者位置,直到i>=j停止。最后将基准值放回数组中间位置,再递归调用快速排序对左右子序列进行排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值