内容简介:快速排序是基于分治思想的排序算法,通过这种策略把列表分为两个子列,重复该过程。是由东尼·霍尔提出,在平均状况下,排序N个数据要O(nlogn)次比较,在最坏情况下则需要O(n^2),但退化成冒泡的情况比较少见,快速排序比其他排序算法通常情况是最佳的,因为内部使用的循环在很多平台都有优化。快速排序的步骤很简单:在维基百科上的这张图可以很直观的展示快速排序的过程
快速排序是基于分治思想的 排序 算法,通过这种策略把列表分为两个子列,重复该过程。是由东尼·霍尔提出,在平均状况下,排序N个数据要O(nlogn)次比较,在最坏情况下则需要O(n^2),但退化成冒泡的情况比较少见,快速排序比其他 排序算法 通常情况是最佳的,因为内部使用的循环在很多平台都有优化。
快速排序的步骤很简单:
- 选择一个基准(多数情况选择列表的第一个)
- 遍历列表,将小于基准的放在列表左边,大于基准的放在列表右边
- 递归这个操作
在维基百科上的这张图可以很直观的展示快速排序的过程
代码实现:
首先需要一个返回基准的函数,该函数负责从指定的范围中挑选一个位置作为基准,并对范围内列表进行排序,并返回基准所在的位置。
int Division(int a[], int left, int right) { int base = a[left]; // 取第一个数为基准 while (left < right) { while (left < right && a[left] > base) { // 从右向左找第一个比基准小的元素 --right; } a[left] = a[right]; // 交换位置,把小元素放在左侧 while (left < right && a[left] < base) { // 从左向右找第一个比基准大的元素 ++left; } a[right] = a[left]; // 交换位置,把大元素放在右侧 } a[left] = base; return left; }
Division函数只做了最简单的事,找一个基准,并交换左右的元素,使列表左侧均小于基准元素,使右侧均大于基准元素,接下来需要一个函数,使列表趋向最小,直至列表元素剩一(这里我感觉其实有点极限的思想)。
void quick_sort(int a[], int left, int right) { if (left < right) { int index = Division(a, left, right); //对列表进行分割 quick_sort(a, left, i -1); //对左侧进行排序 quick_sort(a, i + 1, right); //对右侧进行排序 } }
配合上方的gif,就可以很清楚的了解快速排序是如何使用分治法来排序的,通过将大任务拆分成小任务,最终达成完整的排序.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序
- 排序算法下——桶排序、计数排序和基数排序
- 算法之常见排序算法-冒泡排序、归并排序、快速排序
- 【JS面试向】选择排序、桶排序、冒泡排序和快速排序简介
- 计数排序vs基数排序vs桶排序
- 排序算法--冒泡排序
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C++程序设计原理与实践
(美)Bjarne Stroustrup / 王刚 等 / 机械工业出版社 / 2010.7 / 108.00元
本书是经典程序设计思想与C++开发实践的完美结合,是C++之父回归校园后对C++编程原理和技巧的全新阐述。书中全面地介绍了程序设计基本原理,包括基本概念、设计和编程技术、语言特性以及标准库等,教你学会如何编写具有输入、输出、计算以及简单图形显示等功能的程序。此外,本书通过对C++思想和历史的讨论、对经典实例(如矩阵运算、文本处理、测试以及嵌入式系统程序设计)的展示,以及对C语言的简单描述,为你呈现......一起来看看 《C++程序设计原理与实践》 这本书的介绍吧!
在线进制转换器
各进制数互转换器
HTML 编码/解码
HTML 编码/解码