快速排序

快速排序及优化方案 文章目录快速排序及其优化方案1. 快速排序的流程2. 快速排序的实现时间复杂度计算3. 快速排序优化随机获取基准值进行优化3.2二路快速排序原理:思想:4. 总结 快速排序及其优化方案 1. 快速排序的流程 首先设定一个分界值,通过该分界值将数组分成左右两部分。 将大于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边,而等于分分界值的部分放在相对中间的部分。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于分界值,相对中间的部分的的数据等于分界值。 然后,左边和右边的数据可以独立排序 阅读详情

快速排序的基本思想

快速排序也是利用分治的思想。
如果需要排序的数据的下标是从s到t,在下标s到t之间的任意一个数据作为分区点p,遍历s到t之间的数据,将小于分区点的数据放到分区点p的左边,将大于分区点的数据放到分区点的右边,分区点放在中间,经过这一操作后。数据被分为3个部分,s到p-1之间为小于分区点的数据,p+1到t之间为大于分区点的数据,p为分区点。根据分治递归的处理思想,可以递归排序s到p-1的区间和p+1到t的区间,直到区间缩小为1,说明排序完成,所有数据都已经为有序。
文字还是没有图直观:分区点的择为最末尾的一个元素
首先还是看看分区的操作,一个直观的对比
在这里插入图片描述

快速排序的代码实现

先还是从分区函数的实现开始吧
在这里插入图片描述
在这里插入图片描述
结合图再来看看分区函数的代码实现

/**
 * 分区函数,在快速排序中使用的是原地分区,实现非常的巧妙
 *
 * <p>函数需要返回分区点
 *
 * @param data 原始数据
 * @param s 开始位置
 * @param t 结束位置
 * @return 分区点的位置
 */
private int partition(T[] data, int s, int t) {
  // 1,指定分区点为当前的最后一个元素
  int point = t;
  int i = s;
  for (int j = s; j <= t - 1; j++) {
    // i < j ? -1
    // 如果数据小于分区点,执行互换操作
    if (((Comparable) data[j]).compareTo(data[point]) < 0) {
      // 交换数据
      swap(data, i, j);
      // i向后移动一位,指向分区点
      i += 1;
    }
  }

  // 当结束后,将分区点的位置与i互换,即可完成
  swap(data, i, point);
  // System.out.println(Arrays.toString(data));

  return i;
}

/**
 * 进行数据交换操作
 *
 * @param data 原始数据
 * @param src 原始位置
 * @param target 目标位置
 */
private void swap(T[] data, int src, int target) {
  T dataTmp = data[src];
  data[src] = data[target];
  data[target] = dataTmp;
}

在这里插入图片描述

完整的快速排序的实现:

/**
 * 快速排序的代码实现
 *
 * @author liujun
 * @version 0.0.1
 * @date 2019/10/28
 */
public class QuickSort<T> implements SortInf<T> {

  @Override
  public void sort(T[] data) {

    if (data == null || data.length <= 1) {
      return;
    }
    if (!(data[0] instanceof Comparable)) {
      throw new IllegalArgumentException("data not implement compator interface");
    }

    // 调用快速排序
    this.quickSort(data, 0, data.length - 1);
  }

  private void quickSort(T[] data, int s, int t) {

    // 当前需操作元素仅一个,则退出
    if (t - s < 1) {
      return;
    }

    int point = this.partition(data, s, t);
    quickSort(data, s, point - 1);
    quickSort(data, point + 1, t);
  }

  /**
   * 分区函数,在快速排序中使用的是原地分区,实现非常的巧妙
   *
   * <p>函数需要返回分区点
   *
   * @param data 原始数据
   * @param s 开始位置
   * @param t 结束位置
   * @return 分区点的位置
   */
  private int partition(T[] data, int s, int t) {
    // 1,指定分区点为当前的最后一个元素
    int point = t;
    int i = s;
    for (int j = s; j <= t - 1; j++) {
      // i < j ? -1
      // 如果数据小于分区点,执行互换操作
      if (((Comparable) data[j]).compareTo(data[point]) < 0) {
        // 交换数据
        swap(data, i, j);
        // i向后移动一位,指向分区点
        i += 1;
      }
    }

    // 当结束后,将分区点的位置与i互换,即可完成
    swap(data, i, point);
    // System.out.println(Arrays.toString(data));

    return i;
  }

  /**
   * 进行数据交换操作
   *
   * @param data 原始数据
   * @param src 原始位置
   * @param target 目标位置
   */
  private void swap(T[] data, int src, int target) {
    T dataTmp = data[src];
    data[src] = data[target];
    data[target] = dataTmp;
  }
}

分析快速排序的时间复杂度

最好情况时间复杂度

快速排序也是使用递归来实现的,在分析归并排序时,总结的公式同样适用,在最好情况下,每次都能将数据均匀的分成两个相同的区间,那快速排序与归并排序的时间复杂度是相同的
所以快排的最好情况时间复杂度就是O(nlogn)
t(1)=C 只需要常量级的执行时间,使用C表示
t(n)=2*t(n/2)+n n>1

平均情况下的时间复杂度

假设每次分区都将数据分成9:1的两个区间,继续套用公式来求解时间复杂度:
就会变成
t(1)=C t=1时,只需常量级的时间,表示为C
t(n)=t(9n/10)+t(n/10)+n n>1求解时间复杂度
t(n)=t(9n/10)+t(n/10)+n
(过程我还不能推导出来,目前空余)
只知道结果是n*logn

针对快速排序时间退化成O(n^2)的优化方法

优化方式1:三数取中
从待排序的数组中的头部、中间、还有尾部三个位置各取一个数,然后在这三个数中求出中位数,这种方法肯定比单纯的取固定值的方法要好,当要排序的数据很大时,三数取中可能就不够了,可能就会采用5数取中,或者更大的10数取中。

先还是来说三数取中法吧
首先对前两个数A和B进行比较大小,如果A大于B,则将A与换。
这时开始处理数C,数C处理在这里存在三种情况:
情况1:C小于A,那么A就是中位数
情况2:C大于A,小于B,那么C就是中位数
情况3:C大于B,那么B就是中位数。

在这里插入图片描述

代码实现:


/**
 * 快速排序的代码实现,使用三数取中法进行分区点的选择操作
 *
 * @author liujun
 * @version 0.0.1
 * @date 2019/10/28
 */
public class QuickSortThirdMod<T> implements SortInf<T> {

  @Override
  public void sort(T[] data) {

    if (data == null || data.length <= 1) {
      return;
    }
    if (!(data[0] instanceof Comparable)) {
      throw new IllegalArgumentException("data not implement compator interface");
    }

    // 调用快速排序
    this.quickSort(data, 0, data.length - 1);
  }

  private void quickSort(T[] data, int s, int t) {

    // 当前需操作元素仅一个,则退出
    if (t - s < 1) {
      return;
    }

    int point = this.partition(data, s, t);
    quickSort(data, s, point - 1);
    quickSort(data, point + 1, t);
  }

  /**
   * 分区函数,在快速排序中使用的是原地分区,实现非常的巧妙
   *
   * <p>函数需要返回分区点
   *
   * @param data 原始数据
   * @param s 开始位置
   * @param t 结束位置
   * @return 分区点的位置
   */
  private int partition(T[] data, int s, int t) {
    // 1,分区函数采用三数取中法
    int countPoint = this.dataMid(data, s, t);
    // 求得中位数后将,最后一个位置与中位数互换即可
    swap(data, countPoint, t);

    // 当前的分区点
    int midPoint = t;

    int i = s;
    for (int j = s; j <= t - 1; j++) {
      // i < j ? -1
      // 如果数据小于分区点,执行互换操作
      if (((Comparable) data[j]).compareTo(data[midPoint]) < 0) {
        // 交换数据
        swap(data, i, j);
        // i向后移动一位,指向分区点
        i += 1;
      }
      /// System.out.println("分区数据:" + Arrays.toString(data));
    }

    // 当结束后,将分区点的位置与i互换,即可完成
    swap(data, i, midPoint);

    //    System.out.println("分区点:" + midPoint);
    //    System.out.println("分区完成后" + Arrays.toString(data));

    return i;
  }

  /**
   * 三数取中法
   *
   * <p>对三个数进行比较,然后交换次序
   *
   * @param data 数据
   * @param s 开始索引
   * @param t 结束索引
   * @return 当前的中位数
   */
  public int dataMid(T[] data, int s, int t) {
    // 求两个数的中位数与(s+t)/2效果一致,但在接近最大数时,将不能运算,所以使用t+((s-t)>>1)
    int midIndex = t + ((s - t) >> 1);

    // 首先保证前两个数是有序的
    if (((Comparable) data[s]).compareTo(data[midIndex]) > 0) {
      swap(data, s, midIndex);
    }

    // 分为多种情况,情况1,比最小的数字小
    if (((Comparable) data[t]).compareTo(data[s]) <= 0) {
      return s;
    }
    // 情况2,大于最小,小于最大
    else if (((Comparable) data[t]).compareTo(data[s]) > 0
        && ((Comparable) data[t]).compareTo(data[midIndex]) <= 0) {
      return t;
    }
    // 情况3:大于最大的数,返回最大数
    else {
      return midIndex;
    }
  }

  /**
   * 进行数据交换操作
   *
   * @param data 原始数据
   * @param src 原始位置
   * @param target 目标位置
   */
  private void swap(T[] data, int src, int target) {
    T dataTmp = data[src];
    data[src] = data[target];
    data[target] = dataTmp;
  }
}

优化方式2:随机

就是每次在要排序的数据区间中,随机选择一个点作为分区点,因为是随机挑选的,并不能保证每次挑选的分区点都比较合适,但从概率上来说,也不会每次挑选的分区点都很差。从而,退化到O(n^2)的情况非常的少
代码实现:


/**
 * 快速排序的代码实现
 *
 * <p>使用随机分区点的方法
 *
 * @author liujun
 * @version 0.0.1
 * @date 2019/10/28
 */
public class QuickSortRandomPoint<T> implements SortInf<T> {

  @Override
  public void sort(T[] data) {

    if (data == null || data.length <= 1) {
      return;
    }
    if (!(data[0] instanceof Comparable)) {
      throw new IllegalArgumentException("data not implement compator interface");
    }

    // 调用快速排序
    this.quickSort(data, 0, data.length - 1);
  }

  private void quickSort(T[] data, int s, int t) {

    // 当前需操作元素仅一个,则退出
    if (t - s < 1) {
      return;
    }

    int point = this.partition(data, s, t);
    quickSort(data, s, point - 1);
    quickSort(data, point + 1, t);
  }

  /**
   * 分区函数,在快速排序中使用的是原地分区,实现非常的巧妙
   *
   * <p>函数需要返回分区点
   *
   * @param data 原始数据
   * @param s 开始位置
   * @param t 结束位置
   * @return 分区点的位置
   */
  private int partition(T[] data, int s, int t) {
    // 1,采用随机的方法采用分区点,进行分区
    int countPoint = ThreadLocalRandom.current().nextInt(s, t);
    // 求得中位数后将,最后一个位置与中位数互换即可
    swap(data, countPoint, t);

    // 当前的分区点
    int midPoint = t;

    int i = s;
    for (int j = s; j <= t; j++) {
      // i < j ? -1
      // 如果数据小于分区点,执行互换操作
      if (((Comparable) data[j]).compareTo(data[midPoint]) < 0) {
        // 交换数据
        swap(data, i, j);
        // i向后移动一位,指向分区点
        i += 1;
      }
    }

    // 当结束后,将分区点的位置与i互换,即可完成
    swap(data, i, midPoint);

    return i;
  }

  /**
   * 进行数据交换操作
   *
   * @param data 原始数据
   * @param src 原始位置
   * @param target 目标位置
   */
  private void swap(T[] data, int src, int target) {
    T dataTmp = data[src];
    data[src] = data[target];
    data[target] = dataTmp;
  }
}

快速排序的总结

算法名称最好情况时间复杂度最好情况的原始数据最坏情况时间复杂度最坏情况的原始数据平均情况时间复杂度是否基于比较空间复杂度是否稳定排序算法
快速排序O(nlogn)每次分区都分成大小相同的两个区间O(n^2)原始数据已经有序O(nlogn)是O(n)原地排序算法非移定的原地排序算法
Git由浅入深之细说变基(rebase) rebase,有垫底,基底的意思,Gitrebase我们称它为Git变基,即在当前分支外另一点上重新应用当前分支的提交历史,变基是Git整合变更的一种方式,另一种方式是什么呢(当然是合并了)?变基的基础使用已经在上一篇中提到,此处就不重复了,下面会阐述更深入或者说对于初学者更不常用的Git变基知识点。无论曾经,还是未来,只要你一直使用Git,早晚会遇到这样一种情况:从主干切出了某一分支issue1,进行了一些提交后,有另一个需求,我们在issue1分支切出新分支issue2,进行了提交,这期间其他成员对master主干分支进行了更新,结构图如下:现在,issue2分支开发完,我们需要将其变更并 立即下载

相关推荐

通俗理解Xgboost

为了简化计算,XGBoost采用了一阶导数(梯度)和二阶导数(Hessian)来近似损失函数的变化,从而推导出叶子节点值的更新公式。其中 z 就是所有树的叶子节点分数之和。通过这两个正则化项,XGBoost能够在优化目标函数时,不仅考虑损失函数的最小化,还考虑了模型的复杂度,从而达到更好的泛化性能。正则化项通常包括两个部分:一个是与叶子节点数量相关的项,另一个是与叶子节点输出值大小相关的项。通过这种方式,XGBoost能够有效地计算出每个叶子节点的值,同时通过正则化项来平衡模型的复杂度和泛化能力。

金融风控笔记 750

电脑硬盘分区合并_简单好用的「无损分区软件」,小白也能快速搞定硬盘分区问题...

前言相信很多电脑用户都会遇到硬盘分区的问题,包括买来/组装新电脑时,或者对原有分区不满意,想要重新划分调整等等。虽然 Windows 自带了“磁盘管理”工具,但功能有限。一些操作还需要格式化分区才能完成,无法保留原数据。本文给大家分享一款硬盘无损分区工具——「分区助手」,简单好用,帮大家顺利搞定分区问题。简单好用的无损分区软件分区助手是一款 Windows 端的免费 & 专业的无损分区软件...

weixin_39755890的博客 1981

基于STM32的心电图监测系统设计

本论文旨在设计一种基于 STM32 微控制器的心电图监测系统,通过对人体心电信号的采集、处理和分析,实现对心电图的实时监测与显示。系统采用高精度的心电信号采集模块,结合 STM32 强大的数据处理能力,能够有效去除噪声干扰,提取出准确的心电信号特征。同时,利用 LCD 显示屏实现心电波形的实时显示,并通过蓝牙模块实现数据的无线传输,方便医护人员远程监测。经测试,该系统具有较高的精度和稳定性,能够满足临床心电图监测的基本需求,为医学诊断提供可靠的数据支持。

道亦无名 1348

十大排序——3.快速排序

所以应该先先循环 j,再循环 i。

m0_52096593的博客 754

【红外技术】DDE算法:HE在红外图像可视化上的应用(附源码)

并且数据一般是以 8 的整数倍的位宽在电子系统中应用,因此大多数的显示器的显示位宽为 8bit,共 256 个灰阶。为了使红外图像可视化,因此需要一种“数据压缩”技术,还需要既可能的不丢失原始图像信息。HE后的图像直方图分布比较均匀离散,图像对比度好。但是HE算法只是适用某些图像,它是将灰度集中区域进行拉伸得到,也会放大该集中区域的噪声,它是一种“不公平”的映射。以下是红外细节增强算法的演示,很明显右边的图像,展现了更多的图像细节,对于小目标的观测非常友好。文章已于2019-12-02修改。

sunwindl91181的博客 911

Allegro172版本DFM功能介绍

Allegro172版本提供了实时DFM检查的功能,让违反要求的地方实时以DRC的形式报出来,让加工不可加工因素在设计的时候同步避免。打开Constraint,选择Manufacturing, 所有DFM相关DRC都在这。把所有下面DRC开关(DFM,DFA,DFT)都选择on,选择OK。这个规则和物理和间距规则等等都没有关系,单独的一个加工规则。这些DRC大部分是正常的,正常的可以去修改规则来消除。等待DRC刷新,板子上会出现很多DRC,类似下图。下面介绍如何调用和产生DFM规则。一直往下点击next。

weixin_54787054的博客 1337

数据结构与算法之快速排序

快速排序是对冒泡排序的一种改进,是所有内部排序算法中平均性能最优的排序算法。其基本思想是基于分治法的:在待排序数组L[1…n]中任取一个元素key作为基准,从数组的两端开始扫描。设两个指示标志(low指向起始位置,high指向末尾),先从后向前扫描(high递减),如果high位置的元素小于key,就交换low和high位置的元素,然后从前向后扫描(low递增),如果low位置的元素大于key,就...

[Salvatore]的博客 501

4、机器人建模、规划与控制及运动学知识解析

本博客深入解析了机器人建模、规划与控制的核心内容,涵盖运动学与动力学的基本原理,并结合典型应用场景探讨了移动机器人与操作器的控制策略。同时,博客还介绍了机器人技术的发展趋势及其在工业和服务领域的广泛应用。

desk3的博客 122

快速排序详解

快速排序:两路并排、三路并排

m0_55752775的博客 1342

从0入门LocoTrack:6倍加速的SLAM追踪新范式实战指南

传统点追踪方法(如CorrTracker、TAPIR)在处理大规模场景或实时任务时,要么精度不足,要么速度太慢。而LocoTrack通过“局部4D相关性”和“Transformer全局关联”的创新设计,实现了精度与速度的双重突破速度:比现有SOTA方法快6倍,吞吐量高达数万点/秒;精度:在Kinetics、DAVIS等数据集上,定位误差显著低于传统方法;鲁棒性:能应对低纹理、动态场景等复杂环境,这是传统方法的“噩梦场景”。

m0_71589036的博客 95

[PCIe5.0] 5.3.1.4.2 D3Cold State

主电源(Vcc)完全断开,仅保留极少量辅助电源(Vaux)用于维持基本唤醒功能设备功能完全关闭,所有寄存器状态丢失(除非有特殊存储)需要完全重新初始化才能恢复工作比D3Hot状态功耗更低,但唤醒延迟更长。

系统固件工程师 452

算法-排序算法:快速排序(QuickSort )【O(nlogn)】【单路:随机化无法避免元素全相等时退化为O(n^2)】、【双路+随机化:元素全相等时退化概率极低】【三路:元素全相等时为O(n)】

4、快速排序(Quick Sort)O(nlogn) 快速排序(Quick Sort)的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 2.1 快速排序-算法描述: 快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下: 从数列中挑出一个元素,称为 “基准”(pivot); 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后

u013250861的博客 1696

使用 ABAP 代码动态创建新的 Function Module

通过内表。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 6906

三种快速排序以及快速排序的优化

1、快速排序的基本思想:    快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。 2、快速排序的三个步骤: (1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot) (2)分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在

思考,思考,再思考~ 5万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

经典快速排序与随机快速排序

文章目录一、经典快速排序(一)、经典快速排序的实现理论(二)、经典快速排序的代码实现(Java)(三)、经典快速排序的时间复杂度二、随机快速排序(一)随机快速排序的实现理论(二)随机快速排序的代码实现(Java)(三)、随机快速排序的时间复杂度 一、经典快速排序 (一)、经典快速排序的实现理论 经典快速排序是用数组的最后一个数(这里记为 x )进行划分。也就是 &amp;lt;x、=x、&amp;gt;x。 有...

liyanan的博客 3036

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

双路快速排序

双路快速排序算法是随机化快速排序的改进版本,partition 过程使用两个索引值(i、j)用来遍历数组,将v的元素放在索引j所指向位置的右边,v代表标定值。

fangfan9的博客 2376

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

图解快速排序及双路三路快速排序

前言 之前我们介绍了交换类排序中的冒泡排序,这次我们介绍另一种交换类排序叫做快速排序。快速排序的优点是原地排序,不占用额外空间,时间复杂度是O(nlogn)。 当然,对于快速排序来说,它也是有缺点的,它对于含有大量重复元素的数组排序效率是非常低的,时间复杂度会降为O(n^2)。此时需要使用改进的快速排序—双路快速排序,在双路快速排序的基础上,我们又进一步优化得到了三路快速排序。 快速排序 快速排...

子居的博客 1190

什么是快速排序?

文章目录快速排序快速排序简介:基本思想原理快速排序法示意图排序演示Java代码 快速排序 快速排序简介: 快速排序是对冒泡排序的一种改进。 基本思想 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都小于或者等于另外一部分的所有数据,然后再按照此方法对这两部分数据分别进行快速排序,整个排序的过程可以递归进行,以此达到整个数据变成有序序列。 原理 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选 用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所

热爱编程的菜鸟 5596

快速排序——详解

快速排序(英语:Quicksort),又称分区交换排序(英语:partition-exchange sort),简称「快排」,是一种被广泛运用的排序算法。三路快速排序(英语:3-way Radix Quicksort)是快速排序和基数排序的混合。它的算法思想基于荷兰国旗问题的解法。内省排序(英语:Introsort 或 Introspective sort)4是快速排序和堆排序的结合,由 David Musser 于 1997 年发明。内省排序其实是对快速排序的一种优化,保证了最差时间复杂度为。

w_w_wwwww的博客 1374

[算法]快速排序与随机快速排序

与归并排序一样,快速排序也运用了分治策略,而随机快速排序是对快速排序的一种优化。

hula_hula_的博客 1635

手写快速排序

快速排序简介快速排序是一种很不错的排序算法,算法复杂度为n*logn。快排使用了分而治之的思想,每次排序是都找到一个基准(我们学习时经常使用第一个作为基准),然后把小于基准的元素放到基准元素的左边,大于基准的元素放到基准元素的右边,这样一次排序下来,基准元素左边都是小于(等于)基准的数,基准右边的元素都是大于(等于)基准的元素了。快速排序关键点就是找到这样一个基准并将其放到恰到的位置。算法思路定义一

God Liao On The Way 1万+

分治之快速排序以及快速排序为何最快

算法思想 数组排序任务可以如下完成: 1)设k=a[0],将k挪到适当位置,使得比k小的元素都在k的左边,比k大的元素都在k的右边,和k相等的,不关心在k左右出现均可(O(n)时间完成) 2)把k左边的部分快速排序 3)把k右边的部分快速排序 (假设运气比较好,每次基准元素被移动到中间,这样的话时间复杂度为O(nlogn)) 如何在O(n)的时间内将数组分成两半,一般在小于基准值,一般大于基准值? 程序代码 #include<iostream> using namespace std; int

Java硬件工程师的博客 3189

【快速排序】快速排序/第k个数

acwing算法学习笔记 -----快速排序

青竹雾色间.的博客 1998
上一篇: 跳表
下一篇: 跳表加散列表实现HashMap
null_null_bug
博客等级 码龄7年 72粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值