【排序算法】快速排序

零、写在前面

  • CSDN21天学习挑战赛
  • 本人蒟蒻一枚,文章若有不足之处请大家批评指出,欢迎大家留言。

活动地址:CSDN21天学习挑战赛

一、排序算法

排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个关键字有序的序列。

二、快速排序

快速排序是一种分而治之思想在排序算法上的典型应用。
是对冒泡排序算法的一种改进。

1. 快速排序步骤

快速排序算法多次比较和交换来实现排序。需要通过基准将数据划分成两个部分,这两个部分也通过一个基准划分,一直到不可再分。

1.1 步骤
  1. 以第一个数组元素作为 “基准”(pivot)
  2. 遍历数组,将所有比基准的元素都移动到基准的边。遍历结束后所有比基准小的元素都在基准的左边,比基准大的都在基准的右边,基准所在的位置将组分为左右两个子数组。
  3. 递归地,将左右两子数组重复1.2.的步骤。

2. 代码实现

public static void main(String[] args) {
    int[] arr = {10, 9, 7, 19, 99, 24, 71, 2, 25, 31};
    int[] a = {2,8,7,1,3,5,6,4};
    quickSort(a, 0, a.length - 1);
    for (int data : a){
        System.out.print(data + " ");
    }
}

private static int[] quickSort(int[] arr, int left, int right) {
    if (left < right) {
        int partitionIndex = partition(arr, left, right);
        quickSort(arr, left, partitionIndex - 1);
        quickSort(arr, partitionIndex + 1, right);
    }
    return arr;
}

private static int partition(int[] arr, int left, int right) {
    // 设定基准值(pivot)
    int pivot = arr[left];
    int index = left + 1;
    for (int i = index; i <= right; i++) {
        if (arr[i] < pivot) {
            // 交换两个元素
            int tmp = arr[i];
            arr[i] = arr[index];
            arr[index] = tmp;
            index++;
        }
    }
    // 将基准值交换到对应位置
    arr[left] = arr[index - 1];
    arr[index - 1] = pivot;
    return index - 1;
}

3. 复杂度分析

3.1 时间复杂度

在平均状况下,排序 n 个元素的数组需要 Ο(nlogn) 次比较。
快速排序的最坏运行情况是 O(n2),比如有序时数列的快排,在待排序数据元素已经有序的情况下快速排序时间复杂度最高,退化成冒泡排序。

3.2 空间复杂度

由于使用到了递归,所以使用的空间就和递归的深度有关。
最好情况,每次数据元素都能平均的分成两个部分,得到完全二叉树的状态,空间复杂度O(logn)。
最坏情况,每次数据元素只能分成一个部分,仅只有左(右)子数,空间复杂度为O(n)。

3.3 练习题

215. 数组中的第K个最大元素

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值