5.2.6 三划分快速排序算法
前言
当数组中有大量重复的元素时用三划分可以有效地提升效率,并且当数组中没有大量重复元素时该算法的效率也不低于原快速排序的效率
思路
将 整 个 数 组 分 成 三 份 , 也 就 是 找 两 个 分 界 点 , 我 们 假 设 分 界 点 l , r 满 足 l < r , 则 中 间 有 r − l 个 等 于 v 的 元 素 , 左 右 分 别 为 小 于 v 和 大 于 v 的 元 素 将整个数组分成三份,也就是找两个分界点,我们假设分界点l,r满足l<r,则中间有r-l个等于v的元素,左右分别为小于v和大于v的元素 将整个数组分成三份,也就是找两个分界点,我们假设分界点l,r满足l<r,则中间有r−l个等于v的元素,左右分别为小于v和大于v的元素。
根据这个逻辑,我们可以将等于v的元素分别放到pattern中数组的两端,最后把两端的数字转移到中央。因为根据快排的缘故,最终在中间的数字必然是左边小于v,右边大于v,只要各自把这两段交换一下即可。
为了快速写出正确高效的快排,之后pattern的方式均以下面的形式,这种形式优点是可以少写要交换时的两个指针的移动
实现
void QuickSort(Elem arr[], int l, int r) {if(l >= r) return ;int ltag, rtag, left, right;Elem v = arr[r];left = ltag = l - 1;right = rtag = r;while(1) {while(arr[++left] < v);while(arr[--right] > v) if(left == right) break;if(left >= right) break;swap(arr[left], arr[right]);if(arr[left] == v) {++ltag; swap(arr[left], arr[ltag]); } //当其相等后被拉到旁边,而旁边那个数之前已经验证必然<=v所以之后判++left的元素显然不会产生bug,右边同理if(arr[right] == v) {--rtag; swap(arr[right], arr[rtag]); }}swap(arr[left], arr[r]); //把标兵归为right = left + 1; left = left - 1; //相当于把标兵v左右区间和它相同的拉到中间for(int i = l; i < ltag; i++, left--) swap(arr[i], arr[left]);for(int i = r - 1; i > rtag; i--, right++) swap(arr[i], arr[right]);QuickSort(arr, l, left);QuickSort(arr, right, r);
}
主要的pattern:
Elem v = arr[r];left = ltag = l - 1;right = rtag = r;while(1) {while(arr[++left] < v);while(arr[--right] > v) if(left == right) break;if(left >= right) break;swap(arr[left], arr[right]);}swap(arr[left], arr[r]);return left;
5.2.6 三划分快速排序算法相关推荐
- 快速排序算法(基于Java实现)
title: 快速排序算法(基于Java实现) tags: 快速排序算法 快速排序算法的原理与代码实现: 一.快速排序算法的原理 快排算法的思想是: 如果需要排序数组中下标从p到r之间的一组数据,我们 ...
- 十大经典排序算法-快速排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- php 快速排序函数,PHP实现快速排序算法的三种方法
摘要:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序 ...
- C语言快速排序算法及三种优化方式
C语言快速排序算法及三种优化方式 C语言快速排序算法及三种优化方式 原理 快速排序复杂度分析 1 时间复杂度 2 空间复杂度 快速排序代码实现 1 普通快速排序 2 快速排序优化1-三数取中优化不必要 ...
- 数据结构值排序算法(三)-快速排序
基本思想: 快速排序采用的思想是分治思想. 第一趟排序:快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 ...
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...
- 快速排序算法实现思想个人理解
一.概述 快速排序是冒泡排序的改进算法.它也是通过不断比较和移动交换来实现排序的,只不过它的实现增大了记录的比较和移动的距离,将关键字较大的元素从前面直接放到后面,关键字较小的元素直接从后面放到前面, ...
- 【算法】快速排序算法的编码和优化
参考资料 <算法(第4版)> - - Robert Sedgewick, Kevin Wayne <啊哈! 算法> - - 啊哈磊 ...
- python算法与数据结构-快速排序算法(36)
阅读目录 一.快速排序的介绍 二.快速排序的原理 三.快速排序的步骤 四.快速排序的图解 五.快速排序的python代码实现 六.快速排序的C言语代码实现 七.快速排序的时间复杂度 八.快速排序的稳定 ...
最新文章
- iPhone开发技巧之工具篇(4)--- 使用afconvert转换WAV文件
- OC-数组排序-NSSortDescriptor使用
- 老李分享:接口测试之jmeter
- Python3.6学习笔记(三)
- STL vector 用法
- Bootstrap插件通过noConfllict 避免冲突
- 数据结构上机实践第八周项目5 - 计数的模式匹配
- [HNOI2010]PLANAR
- 单片机C语言程序设计实训100例基于8051+Proteus仿真
- Linux统计代码行数
- python编程加减法_python编程题关于二进制加减法运算解析
- 前台离岗提示语_安全温馨提示语大全.doc
- 陶哲轩实分析 3.1节 习题试解
- 【教程】公众号图文添加Word、Excel、PDF等文件
- AVR单片机网址推荐
- IndexedDB 学习笔记
- 谷歌gmail注册入口_如何下载所有Gmail,日历,文档和其他Google数据的备份存档...
- 分支循环语句练习和友尽模拟器的综合应用
- js 截取指定字符前的字符
- 关于浏览器主页被劫持问题解决办法