目录

算法思想

三指针分区法

代码实现(Java)

时间复杂度


算法思想

当所有数的左边的数据都小于等于这个数,右边的数据都大于这个数时,数组就有序了。

三指针分区法

  1. 先初始化主元为首元,然后初始化三个指针:smaller和equal都初始化为下标为数组第二个、bigger初始化为尾元。smaller为扫描指针,每次移动smaller
  2. 当smaller扫描到的数字小于主元,则下标为smaller和equal的需要交换数据,这样就又将小于主元的放在一起了,然后smaller和equal都要自增
    当smaller扫描到的数字等于主元,直接将smaller自增
    当smaller扫描到的数字大于主元,就将小标为smaller和bigger上的数据交换,bigger再自减(和单向扫描分区法处理一样)
  3. 直到smaller已经超过了bigger,这时候(equal-1)指向的是最后一个小于等于主元的数,交换首元与(equal-1)上的数据
  4. 将小于主元和大于主元的两个数组进行快速排序
  5. 32分16,16分8,8分4,4分2,2分1,当左右两边数组的长度为0时,这个数组就已经排好序了

代码实现(Java)

 private static void sort(int[] array, int start, int end) {//初始化三指针//小于主元的指针和等于主元的指针都初始化为下标为数组第二个//大于主元的指针初始化为尾元int smaller = start+1;int equal = smaller;int bigger = end;//设置退出条件if(smaller > bigger) return ;//选择主元,一般为首元int num = array[start];/** 当smaller扫描到的数字小于主元,则下标为smaller和equal的需要交换数据,这样就又将小于主元的放在一起了,然后smaller和equal都要自增* 当smaller扫描到的数字等于主元,直接将smaller自增* 当smaller扫描到的数字大于主元,就将小标为smaller和bigger上的数据交换,bigger再自减(和单向扫描分区法处理一样)*/while(smaller <= bigger) {if(array[smaller] < num) {swap(array, equal, smaller);equal++;smaller++;}else if(array[smaller] == num) {smaller++;}else if(array[smaller] > num) {swap(array, smaller, bigger);bigger--;}}//交换首元与right上的数swap(array, start, equal-1);//继续将right两边的数组进行快速排序sort(array, start, equal-2);sort(array, bigger+1, end);}private static void swap(int[] array, int sc, int r) {int num = array[sc];array[sc] = array[r];array[r] = num;}

时间复杂度

每次处理数组的一半,一共要处理次,每次处理要扫描个数据,所以时间复杂度为

数组排序(5) 快速排序之三指针分区法相关推荐

  1. C语言 | 快排双向扫描:快速排序双向扫描分区法(源代码)

    ================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...

  2. 使用双亲指针表示法存储一棵树,可以方便解决下列哪个应用问题( )

    使用双亲指针表示法存储一棵树,可以方便解决下列哪个应用问题( C ) A. 最短路径 B. 树的遍历 C. 等价类 D. 优先级队列 等价类问题通过并查集算法实现. 等价类采用存储结构为双亲节点表示法 ...

  3. c语言指针索引数组,C语言数组指针表示法

    指针在处理数组时很有用,我们可以用指针指向已有的数组,也可以从堆上分配内存然后把这块内存当做一个数组使用.数组表示法和指针表示法在某种意义上可以互换.不过,它们并不完全相同,后面的"数组和指 ...

  4. C语言小题,将字符串a复制为字符串b,然后输出字符串b。(地址法和指针变量法)(通过指针引用字符串)

    前言: 此篇是针对 通过指针引用字符串 方面的练习.本篇介绍两种方法 地址法 和 指针变量法. 方法一:(地址法) 解题思路: 定义两个字符数组 a 和 b ,用 "I am a stude ...

  5. DS007-二叉树-伪指针表示法-先根-中根-后根遍历

    本篇介绍二叉树的伪指针表示法,及其先.中.后根遍历. 以下面这棵二叉树为例. 对应的伪指针存储结构为: 整体是一个顺序表,每个元素是一个结构体,包含本身元素,左孩子的下标,右孩子的下标. 也可以包含双 ...

  6. 6-4 指针选择法排序

    指针选择法对10个数进行由大到小的排序. 函数接口定义: void sort(int *x,int n); 函数sort中 x 和 n 都是用户传入的参数.函数将指针x所指数组中的n个元素按选择法降序 ...

  7. 快慢指针追逐法寻找单链表中环的起点

    寻找单链表环的起点 题目 解决思路 代码 说明 题目 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null.如下图中数字2对应的节点为环的第一个节点: 输入:head = [3 ...

  8. java实现数组排序代码_Java使用选择排序法对数组排序实现代码

    编写程序,实现将输入的字符串转换为一维数组,并使用选择排序法对数组进行排序. 思路如下: 点击"生成随机数"按钮,创建Random随机数对象: 使用JTextArea的setTex ...

  9. 主元排序法c语言写法,快速排序隨即主元法

    快速排序的最壞情況基於每次划分對主元的選擇.基本的快速排序選取第一個元素作為主元.這樣在數組已經有序的情況下,每次划分將得到最壞的結果.一種比較常見的優化方法是 隨機化算法,即隨機選取一個元素作為主元 ...

最新文章

  1. c++ 按键暂停继续 程序_CNC操作面板讲解,看看这些按键是什么意思
  2. 从深圳回武汉的面试感想以及一些面试题
  3. bootstrapmodel确认操作框_提醒!2020国考报名确认最后一天!错过无法参加笔试
  4. java phantomjs_Java爬虫:Jsoup + Phantomjs
  5. 深度探秘 从 Auto Labeler 挖掘 Tesla 全自动驾驶的工作机制
  6. python数据类型基础与解压缩
  7. ffmpeg-URL(转)
  8. Solr+Hbase多条件查(优劣互补)
  9. 一个程序员如何做到结构上胸有成竹
  10. ggforce|绘制区域轮廓-区域放大-寻找你的“onepiece”
  11. Unity 脚本生命周期流程图
  12. iOS GZWaterfall任何形式的瀑布流
  13. springboot+mybatis 的org.mybatis.spring.MyBatisSystemException 解决方法
  14. MySQL中使用SQL语句对字段进行重命名
  15. php工作流如何实现,工作流设计参考(包括PHP实现)
  16. Linux字体库ttc还是ttf,几种操作系统字体格式:otf/ttf/ttc格式字体的区别
  17. 为什么计算机里没有桌面显示不出来,电脑开机不显示桌面怎么办解决教程
  18. ssh遇到密钥更改问题
  19. 店铺动态评分怎么生效?店铺评分低会影响天猫店铺续签吗?
  20. 2019年度受欢迎的开源软件

热门文章

  1. SCRUM团队的三个角色
  2. 二级域名,https协议的申请配置
  3. Java计算任意多边形面积
  4. 云服务器上部署仿牛客网项目
  5. android 吐泡泡动画,android仿摩拜贴纸碰撞|气泡碰撞
  6. Java CSS3:(七)CSS3 中常用的样式(跳动的心)
  7. 面试刁难题——你有哪些缺点?
  8. yolo的map计算详解
  9. 基于ensp的网络设计【实现网络互联、限制访问、内外网地址转换】
  10. 《一本书读懂24种互联网思维》---- 读书笔记