1.霍尔快排


int partsort1(int *a, int begin, int end)//begin,end分别为数组头尾元素下标
{int left = begin;int right = end;int key = begin;while (left < right){while (left < right && a[right] >= a[key]) //从右边开始找小于key位置的数{right--;}while (left < right && a[left] <= a[key]) //从左边开始找大于key位置的数{left++;}Swap(&a[right], &a[left]);}Swap(&a[key], &a[left]);key = left;return key;
}
void quicksort(int *a, int begin, int end)
{if (begin >= end){return;}int key = partsort1(a, begin, end);quicksort(a, begin, key - 1);quicksort(a, key + 1, end);
}

快排的思路就是任意取排序元素中的一个作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

例如:6, 1, 2, 7, 9, 3, 4, 5, 10, 8
第一次首先设key为头下标(即6为基准值),left为头下标,right为尾下标。right从右边往左,查找到小于比key所对应的数,接着left从左往右找到大于key所对应的数,然后交完left和right所对应的数。

如此处的例子,right找的是5,left找到的是7,接着5和7交换位置。
6,1,2,5,9,3,4,7,10,8(此时left的下标为3,right的下标为7)

接着right继续寻找到4,left寻找到9,两数交换。

6,1,2,5,4,3,9,7,10,8(此时left下标为4,right的下标为6)

接着继续寻找,right寻找到3,left恰好下标与right相等,停止循环。(此时right和left都是所对应的数都是3)

此时交换的是left和key所对应的数6

3,1,2,5,4,6,9,7,10,8
此时可以看到6左边的数都是小于6,6右边的数都是大于6。

接着利用递归思想分别对3,1,2,5,4和6,9,7,10,8进行快排,思路如上述。

注意==此处代码是把头元素作为基准值,则需要右边先找出小于基准值的数,再从左边开始找出大于基准值的数。顺序不能调换,如果先从左边开始找大,再从右边开始找小,就无法保证最后基准值左边都是小于基准值,右边都是大于基准值

如上面过程解释的这一步中:
6,1,2,5,4,3,9,7,10,8(此时left下标为4,right的下标为6)
如果是left先找大,那么left就会与right相遇停止循环。
此时(left和right下标则为6)
在进行基准值与left两数交换就会出现如下
9,1,2,5,4,3,6,7,10,8
基准值6的左边出现比6大的数。

简单来说:
基准值为头值,则先右再左
基准值为尾值,则先左再右。

【排序】快排(霍尔快排)相关推荐

  1. Java面试宝典系列之基础面试题-常见的几种排序算法-插入、选择、冒泡、快排、堆排等

    常见的几种排序算法-插入.选择.冒泡.快排.堆排: https://blog.csdn.net/zhangerqing/article/details/8831542

  2. 【排序算法】插入、选择、堆排、快排、归并、计数

    一.插入排序 insertSort 1.实现 2.性能分析 3.折半插入排序(了解) 二.希尔排序 ShellSort 1.原理 2.实现 3.性能分析 三.选择排序 selectSort 1.原理 ...

  3. 居然还有比快排更快的排序

    前言        快速排序(Quick Sort)是目前应用最广泛的排序算法,因其时间复杂度低和内循环较小,而且不需要太多的额外空间,广泛应用于工业界.比如JDK源码中的排序算法就是使用的快速排序. ...

  4. Python 实现快排、堆排

    Python 实现快排.堆排 1.快排 原理:(升序) 选取数组的首个元素做为中间值,缓存这个中间值,该位置变为空: 从右到左和中间值对比,找到第一个小于中间值的元素,把该值放到左边的空位,该位置变为 ...

  5. 分治法:快速排序,3种划分方式,随机化快排,快排快,还是归并排序快?

    快速排序不同于之前了解的分治,他是通过一系列操作划分得到子问题,不同之前的划分子问题很简单,划分子问题的过程也是解决问题的过程 我们通常划分子问题尽量保持均衡,而快排缺无法保持均衡 快排第一种划分子问 ...

  6. 【LeetCode笔记】215. 数组中的第K个最大元素(Java、快排、堆排、并发快排)

    文章目录 题目描述 思路 & 代码 快排 基于 Fork / Join 的并发快排 针对 topK 的快排优化 堆排 基本堆排 结合题目的堆排 二刷 题目描述 大名鼎鼎的TOP K,主要考察排 ...

  7. 选择第K大元素(快排、快选以及k-选取比较)

    选择第K大元素(快排.快选以及k-选取比较) 问题:编写一段程序,随机生成10^4, 10^5, 10^6个随机数,并分别在这三者中,分别使用快排和linearSelect()方法,选择出第100大的 ...

  8. c语言寻找大富翁,PTA 7-38 寻找大富翁(25 分)解法(C/C++)暴力快排/精准堆排 解法...

    7-38 寻找大富翁 (25分) 胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人.假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁. 输入格式: 输入首 ...

  9. 大一寒假培训(二)——快排与桶排

    大一寒假培训(二) 今天是寒假培训的第二天,今天学了快排和桶排.以下是今天做的习题. nefu 1481 谁考了第k名-排序 Description 在一次考试中,每个学生的成绩都不相同,现知道了每个 ...

最新文章

  1. 【数理知识】《积分变换与场论》王振老师-第4章-矢量分析
  2. python定义字典列表_[Python基础]五、列表、元组和字典
  3. chrome调试工具常用功能整理
  4. 写你自己的MVC框架
  5. flash player 10 音频新API使用:调节音高(pitch)
  6. linux文件系统目录操作实验报告,Linux操作系统实验报告
  7. fedora 18 视频解码器安装
  8. 【电脑删不掉文件或文件夹】总结7种方法永久删除!
  9. bert之我见-attention
  10. 你的才艺怎样变现?--Rarible平台
  11. 有关微型计算机控制系统的论文,计算机控制系统 徐文尚
  12. 循序渐进学Java day1
  13. 强化学习-利用Q-Learning算法玩走方格游戏(C++)
  14. IoT通讯技术选型及模型设计的思考
  15. 基于Java毕业设计服务管理系统源码+系统+mysql+lw文档+部署软件
  16. CSS布局示例 1 - 页面色块布局
  17. 信道模型:Rayleigh、Rician、卫星→地面:Shadowed-Rician
  18. 洛谷 P4389 付公主的背包 多项式exp
  19. [bzoj 1143--CTSC2008]祭祀
  20. Android 开发中使用硬件加速

热门文章

  1. win10系统下vs2015编写的C++程序在XP系统里运行
  2. MacOS:xcrun: error: invalid active developer path
  3. 青铜修炼手册:Axure地图搜索交互
  4. DBFS CLI : 02-文件操作相关常用命令
  5. 瓷砖铺贴方法_地砖铺贴方法 地砖铺贴流程
  6. 求出 2 到 n 之间 (含 n)的所有素数。
  7. pytest报错 E ModuleNotFoundError解决办法
  8. vue使用marked解析markdown文本遇到的坑及解决方法
  9. Photoshop + ExifToolGUI 完美复制照片信息
  10. vue实现未登录无法访问某页面