快速排序(Quick Sort)

快速排序(Quick sort) 一、简介 快速排序是(Quick sort)是对冒泡排序的一种改进,是非常重要且应用比较广泛的一种高效率排序算法。 二、算法思路 快速排序是通过多次比较和交换来实现排序,在一趟排序中把将要排序的数据分成两个独立的部分,对这两部分进行排序使得其中一部分所有数据比另一部分都要小,然后继续递归排序这两部分,最终实现所有数据有序。 大致步骤如下: 首先设置一个分界值也就是基准值又是也称为监视哨,通过该分界值将数据分割成两部分。 将大于或等于分界值的数据集中到右边,小于分界值的数据集中到左边。一趟排序过后,左边部 阅读详情

快速排序是对冒泡排序的一种改进,由C.A.R.Hoare在1962年提出。快速排序在最坏情况下的时间复杂度和冒泡排序一样是 O ( n 2 ) O(n^2) O(n2),最好时间复杂度和平均时间复杂度为 O ( n l o g 2 n ) O(n{\bf log}_2n) O(nlog2​n)。

基本思想

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。它的实现逻辑为:

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

案例

案例可以查看参考文献4。

代码实现

public class Template {

    public void quickSort(int[] arr, int l, int r) {
        if (l >= r) return;
        int i = l, j = r, tmp = arr[i];
        while (i < j) {
            while (i < j && arr[j] > tmp) j--;
            if (i < j) arr[i++] = arr[j];
            while (i < j && arr[i] < tmp) i++;
            if (i < j) arr[j--] = arr[i];
        }
        arr[i] = tmp;
        quickSort(arr, l, i - 1);
        quickSort(arr, i + 1, r);
    }

    public static void main(String[] args) {
        Template temp = new Template();
        int[] arr = {72, 6, 57, 88, 60, 42, 83, 73, 48, 85};
        temp.quickSort(arr, 0, 9);
        System.out.println(Arrays.toString(arr));
    }
}

加入随机选择后的快排:

    public static void quickSort(int l, int r, int[] arr) {
        if (l >= r) return;
        int i = l, j = r;
        int mid = arr[rand.nextInt(r - l + 1) + l];
        do {
            while (arr[i] < mid) i++;
            while (arr[j] > mid) j--;
            if (i <= j) swap(i++, j--, arr);
        } while (i <= j);
        quickSort(l, j, arr);
        quickSort(i, r, arr);
    }

    public static void swap(int i, int j, int[] arr) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

参考文献:

  1. 快速排序!名字就叫“ 快速 ”排序,你服不服?
  2. 快速排序算法详解(原理、实现和时间复杂度)
  3. 快速排序时间复杂度分析
  4. 快速排序
PHP实现Quick sort快速排序(附完整源码) 阅读详情

相关推荐

电网加密芯片全解析:分类与功能​

在电网数字化转型的浪潮中,数据安全和设备的身份认证变得愈发重要。加密芯片作为保障电网信息安全的核心部件,凭借独特的技术特性,在不同应用场景下发挥着关键作用,有力推动着智能电网的安全稳定发展。接下来,我们将对电网中常见的加密芯片展开分类介绍,并探讨其对应的功能。​。

1962

排序——快速排序(Quick sort)

概况 快速排序(Quick sort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1960年提出。 算法思路 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 快速排序算法通过多次比较和交换来实现排序,其排序流程如下: ......

努力中的老周的专栏 32万+

5.1 Tessent Atpg系列 第八章 Test Pattern Generation - Verify Test Pattern

为什么要做基于timing的仿真,意义在于可以比较ATPG工具和simulator工具的差异性。因为时序的差异导致不同的结果。首先你需要通过write_patern 这句cmd来写出pattern,默认是parallel 模式,除非你用-serial 指定写出serial, 因为serial 文件非常大,所以你可以使用-sample 开关写出部分pattern即可,工具会根据每一种pattern 类型都会至少保存一只。 另外,你也可以使用-start -end 开关来减少文件大小,但是这样的截取,是不可靠的

ciscomonkey的博客 7761

js中,什么是快速排序(Quick Sort)

在 JavaScript 中,是一种高效的、基于的递归排序算法。然后,最终合并得到有序数组。

2401_86373285的博客 411

IAR9.4报错之编码方式

IAR9.40编码方式错误导致的报错

qq_36081075的博客 2626

验证码接收平台搭建教程(含源代码)

在很多注册流程中,我们常常需要通过短信验证码验证用户的身份。本教程将手把手教你搭建一个验证码接收平台,用于自动接收并展示来自短信网关或短信转发器的验证码。⚠️ 本教程仅供学习使用,请勿用于任何非法用途!本教程展示了一个简单的验证码接收平台的搭建流程,从后端到前端完整实现。你可以将其用于学习 Web 开发、数据库操作以及 Flask 项目部署。访问我的优快云主页。

weixin_52548902的博客 4082

快速排序Quick Sort

使用代码和案例分析深入了解和学习快速排序的原理与实践

每行代码都热烈滚烫。 958

WIFI CSI动作识别数据集全解析:从数据采集到深度学习应用

本文全面解析了利用商用Wi-Fi设备的信道状态信息进行动作识别的完整流程。文章以经典WiSA数据集为例,深入剖析了CSI数据的采集原理、结构特点,并详细阐述了从原始数据预处理、特征工程到深度学习模型(如CNN-LSTM融合架构)构建与优化的关键技术,旨在为研究者提供从数据到应用的全链路实战指南。

r2s3t4的博客 281

快速排序quick sort

.. public class QuickSort { public static int partition(int[] ints, int left, int right){ int base = ints[left]; while(left < right){ while(left = base){ right--; } ints[left] = i

jjavaboy的专栏 1639

瑞芯微RK3588与FPGA的PCIe DMA通信性能优化实战

本文深入探讨了瑞芯微RK3588与FPGA之间PCIe DMA通信的性能优化实战。针对高速数据采集、AI推理等场景下的带宽瓶颈,文章从驱动配置、DMA描述符、中断处理、零拷贝技术及系统级调优等多个层面,提供了详细的优化策略与代码示例,旨在充分释放PCIe 3.0的理论带宽潜力,提升数据传输效率与稳定性。

sand8的博客 417

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

快速排序(Quick-Sort)

快速排序(Quick-Sort)对于包含n个数的数组来说,快速排序是一种最坏情况下时间复杂度为O(n²)的排序算法。虽然最坏情况下的时间复杂度很差,但是快速排序通常是实际应用中最好的选择,因为它的平均性能非常好。 下面是算法导论中给出的快速排序的伪代码: QUICK-SORT(A,p,r)   if p < r   q = PARTITION(A,p,r)   QUICK-SORT(A,p

CvShrimp的博客 534

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C语言快速排序(QUICK-SORT)

平均时间复杂度:O(n*logn) 最坏时间复杂度:O(n2) 空间复杂度: O(logn) 数据元素稳定性:不稳定 #include<stdio.h> int quick_sort(int *a,int low,int high){ if(low < high){ //当两个下标不重合的时候开始排序 int i = low; //把low 和 high 先存起来 int j = high; int k = a[low]; //把最左...

柒哥的博客 1649

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Quick Sort  快速排序

Quicksort is a well-known sorting algorithm developed by C. A. R. Hoare that, on average, makes Θ(n log n) comparisons to sort n items. However, in the worst case, it makes Θ(n2) comparisons. Typic...

孤月水明 408

快速排序法-Quick Sort

快速排序法-Quick Sort 【算法思想】 (1)在当前数组中选择一个数为基点,使它处于排好序的位置,并且这个数左边的数小于它,右边的数大于它。 (2)分别对这个基点左右两边的数进行相同操作。 【Partition】 (1)通常选取数组最左边的数作为分界点元素,这里我们标记为l,然后我们开始遍历剩余的数组,将其分为小于v的部分和大于v的部分,这两个部分的分界点我们用j来表示。当前访问的元素...

Blog of a programmer who wants to open a cafe 239

快速排序 (Quick Sort)

Source : https://github.com/hujingbo98/algorithm/blob/master/source/algorithm/sort/quickSort.cpp 排序问题 输入:n 个数的一个序列 {a[0], a[1], ... , a[n-1]}。 输出:输出序列的一个排列 {a[0]', a[1]', ... , a[n-1]'},其中 a[0]' <= a[1]' <= ... <= a[n-1]'。 快速排序 (Quick Sort) 快速排.

博弈的博客 1504

关于快速排序 quick sort

基本思想:快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。注意:冒泡排序的任意两个元素之间都有比较,所以总的比较次数为(n(n-1)/2)。         快速排序在一趟排序之后,被关

zhaoxinkuan的专栏 923

快速排序(Quick Sort)

快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在1962年提出。快速排序是相同数量级的排序算法中,平均性能最好的算法,是内部排序实现的优选算法。

云原生Java Web领域技术博客 5677

快速排序 Quick Sort

文章目录快速排序1. 基本原理2. 算法步骤3. 算法图解4. 动画演示5. 参考实现6. 复杂度分析7. References 快速排序 1. 基本原理 快速排序是图灵奖得主 C. R. A. Hoare 于 1960 年提出的一种划分交换排序,它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。 分治法的基本思想是:将原问题分解为若干个规模更小但结构与...

wylu 539

快速排序(Quick-Sort)及优化

随机排序,快速排序,排序算法,力扣,Leetcode,笔试,Java,c++

qq_57469718的博客 1949

【转】快速排序 Quick Sort

快速排序 Quick Sort   快速排序的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。   一趟快速排序(或一次划分)的过程如下:首先任意选取一个记录(通常可选第一个记录)作为枢轴(或支点)(pivot),然后按下列原则重新排列其余记录:将所有关键字比它小的记录都安置在它的...

yuan_09的专栏 331
上一篇: 计数排序(Counting Sort)
下一篇: KMP算法(Knuth-Morris-Pratt字符串查找算法)
小菜2小白
博客等级 码龄4年 4粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值