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

文章目录

一、算法

1.算法概述

2.算法步骤

3.算法特点

二、算法实践

1.Java代码

2.执行结果

3.讲解视频

三、复杂度分析

1.时间复杂度

2.空间复杂度


一、算法

1.算法概述

快速排序(Quick Sort)是由冒泡排序改进而成的。在冒泡排序中,每次只对相邻的两个记录进行比较,因此每一次交换相邻记录时只能一次消除一个逆序;而快速排序则是对这一缺点进行改进,它通过交换两个(不相邻)的记录来消除多个逆序,从而大大加快了排序的速度,提升了排序的性能。

文章传送门 :经典算法之冒泡排序与直接选择排序

2.算法步骤

  • 在待排序的n个记录中任取一个记录(通常取第一个元素)作为枢轴,设其关键字为key
  • 经过一趟排序后,把所有关键字小于key的记录交换放到key前面,把所有关键字记录大于key的记录交换放到key后面,结果将待排序的记录分成了两个子表,最后将枢轴key放到分界处的位置
  • 然后,分别对上面的左、右两个子表重复上述的过程,直至每一个子表只有一个元素时,则排序完成

其中一趟快速排序的具体步骤如下:

  1. 选择待排序表中的第一个记录作为枢轴, 将枢轴记录暂存在r[0]的位置上。附设两个指针low和high,初始时分别指向表的下界和上界(第一趟时,low= 1; high = L.length; )。
  2. 从表的最右侧位置依次向左搜索,找到第一个关键字小于枢轴关键字key的记录,将其移到low处。具体操作是:当low<high时,若high所指记录的关键字大于等于key,则向左移动指针high (执行操作--high);否则将high所指记录移到low所指记录。
  3. 再从表的最左侧位置,依次向右搜索找到第-一个关键字大于key的记录和枢轴记
    录交换。具体操作是:当low<high时,若low所指记录的关键字小于等于key,则向右移动
    指针low (执行操作++low );否则将low所指记录与枢轴记录交换。
  4. 复步骤2和3,直至low与high相等为止。此时low或high的位置即为枢轴在此趟排
    序中的最终位置,原表被分成两个子表

在上述过程中,记录的交换都是与枢轴之间发生,每次交换都要移动3次记录,可以先将枢
轴记录暂存在r[0]的位置上,排序过程中只移动要与枢轴交换的记录,即只做r[low]或r[high]的
单向移动,直至一趟排序结束后再将枢轴记录移至正确位置上。

3.算法特点

  • 由于记录是非顺次移动导致快速排序是不稳定排序
  • 排序过程中需要定位表的下界和上界,所以适用于顺序结构,很少用于链式结构
  • 当n较大时,在平均情况下快速排序是所有内部排序中速度最快的一种
  • 故其适用于初始记录无序、n较大的情况

二、算法实践

1.Java代码

package TwentyOne_Challenge;public class DayEight{public static void main(String[] args) {int a[]={7,13,6,50,25,78,11,100};System.out.println("原来无序序列为:");for (int i = 0; i < a.length ; i++) {System.out.print(a[i]+" ");}System.out.println();System.out.println("经快速排序后:");//快速排序法quickSort(a);for (int i = 0; i < a.length ; i++) {System.out.print(a[i]+" ");}}private static void quickSort(int[] array) {quickSortFunc(array, 0, array.length-1);}private static void quickSortFunc(int[] array, int start, int end) {if (start >= end) return;//找基准值的下标int keyIndex = findKey(array, start, end);//对左子序列进行递归快速排序quickSortFunc(array, start, keyIndex-1);//对右子序列进行递归快速排序quickSortFunc(array, keyIndex+1, end);}private static int findKey(int[] array, int left, int right) {//取左边界元素为基准值,该位置“挖坑”int key = array[left];int start = left;int end = right;while (start < end) {//从右往左扫描,寻找比key小的记录while (start < end && array[end] >= key) {end--;}array[start] = array[end];//从左往右扫描,寻找比key大的记录while (start < end && array[start] <= key) {start++;}array[end] = array[start];}//start与end相等时的位置,即到达基准值位置array[start] = key;//返回基准值的下标return start;}
}

2.执行结果

3.讲解视频

快速排序算法

 (注:视频来源于B站up主:codereasy)


三、复杂度分析

注:以下图片来自于教材《数据结构(C语言版)》——严蔚敏 李冬梅 吴伟民 编著

1.时间复杂度

2.空间复杂度

经典算法之快速排序法(附B站最细讲解视频)相关推荐

  1. 求全排序的经典算法“后补法”

    //用于求全排序的经典算法"后补法",代码如下: #include <stdio.h> #include <conio.h> #include <st ...

  2. 经典算法07 快速排序

    ​经典算法07 快速排序 ​ 活动地址:CSDN21天学习挑战赛 *学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰. 算法思想: 在待排序表L[1-n]中任取一个元素p ...

  3. 经典算法之,细化时间颗粒度24*7细化为48*7颗粒度

    经典算法之,细化时间颗粒度247细化为487颗粒度 文章目录 经典算法之,细化时间颗粒度24*7细化为48*7颗粒度 前言 一.什么时间颗粒度24*7? 二.代码实现 2.效果截图 总结 前言 就算法 ...

  4. 五大经典算法之回溯法

    一.基本概念   回溯法,又称为试探法,按选优条件向前不断搜索,以达到目标.但是当探索到某一步时,如果发现原先选择并不优或达不到目标,就会退回一步重新选择,这种达不到目的就退回再走的算法称为回溯法. ...

  5. 第39级台阶回溯算法c语言,五大经典算法之回溯法 - osc_9ipdey7e的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.基本概念 回溯法,又称为试探法,按选优条件向前不断搜索,以达到目标.但是当探索到某一步时,如果发现原先选择并不优或达不到目标,就会退回一步重新选择,这种达不到目的就退回再走的算法称为回溯法. 与穷 ...

  6. PHP冒泡排序算法和快速排序法

    算法说明: 冒泡排序大概的意思是依次比较相邻的两个数,然后根据大小做出排序,直至最后两位数.由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序.但其实在实际过程中也可以根据 ...

  7. 调包侠福音!机器学习经典算法开源教程(附参数详解及代码实现)

    Datawhale 作者:赵楠.杨开漠.谢文昕.张雨 寄语:本文针对5大机器学习经典算法,梳理了其模型.策略和求解等方面的内容,同时给出了其对应sklearn的参数详解和代码实现,帮助学习者入门和巩固 ...

  8. 【JavaScript算法】---快速排序法

    一.快速排序法概念 我们将一个杂乱无章的数组进行一个快速排序,可以先从一个数组中取一个中间值,将一个数组一分为2,左边的数组跟中间值进行比较,小的放在左边,大的放在右边.比较完毕后再次取中间值,再次比 ...

  9. 五大经典算法之回溯法及其应用

    前言 回溯法是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的 ...

最新文章

  1. 【HDU】1237 简单计算器 (stack)
  2. SRA数据库的各种编号(DRP, ERP 或SRP)
  3. 人工智能重构下的金融场景
  4. 移动互联网改变商业环境:商品的颠覆
  5. 白话数字签名(番外篇)----签名EXE文件(下)
  6. 对NUnitAddIn做了下修改
  7. java怎么实现人物的行走,js键盘事件实现人物的行走
  8. 中国飞机制造及修理行业未来需求预测及发展态势研究报告2021版
  9. 直播协议HTTP-FLV标准解读与技术实现
  10. 读《C程序设计语言》
  11. Java定时任务(一) Timer及TimerTask的案例解析及源码分析
  12. ubuntu 安装php 5.4.9 编译安装
  13. 票据通的支票管理的账户管理的对应账号支票已使用该怎么重新修改票据打印模板;
  14. python代码 将文件夹下的.png图片转换为.mat图片 批量转换为mat
  15. Android中使用webview加载网页上的按钮点击失效
  16. android ios 夜间模式切换,iOS-夜间模式(换肤设置)
  17. 人工智能的发展历程和未来发展趋势
  18. 杨永智:创业者需具备的六大基因 五大攻略(下)
  19. 微信小程序高度自适应布局
  20. 试看5分钟视频python_不会Python吗?几分钟看完资深程序员给你的Python入门指南...

热门文章

  1. Revit过滤器使用
  2. Mercury:唯品会全链路应用监控系统解决方案详解(含 PPT)
  3. Solid-state revolution: in-depth on how SSDs really work
  4. 计算机在桌面哪个地方,win10正式版我的电脑在哪里?如何把此电脑显示在桌面?...
  5. RN- 判断安卓是否是全面屏及是否开启了全面屏
  6. IDEA--自定义注释模板
  7. HBase协处理器及二级索引
  8. 新手想做短视频可以选择什么领域,这三个可以无脑尝试
  9. 读书笔记-深度学习推荐系统1-概述章节
  10. PAT乙级-1024 科学计数法- C语言实现(31行AC)