因为<The C Programming Language>一书中有一个练习,需要用到快速排序,所以又复习了一下,感觉收获颇多,故而分享之. 快速排序的核心是一种 divide and conquer 算法.可惜我们接触的中文书籍里面,突出强调了一趟快速排序怎么做,而没有重点介绍这种编程思想,可谓是本末倒置.单就一趟排序的细节来说,有很多中实现版本,每种版本都是处于不同的考虑.我们在那本蓝皮的<数据结构>当中学到的快速排序是一种 in-place quick sort.这个版本对空…
快速排序有三大要素 分别是 第一:找基准值--key 第二:分区 第三:比较数字大小 先来看下快速排序流程: 基准值key选取了第一个元素78 基准值是可以任意一个元素 因为选择了最左边的数据,那么就从右边开始遍历 经过上一轮变化key变成了78 位置也变了,开始从key的左边遍历,当 i=j的时候,结束遍历,开始分区 分区后,每个区再进行上面的比较 继续分区,直到分区里面只有两个或者3个元素,分区后,每个分区继续比较 现在每个分区已经最小了,获得最后排列的值 Python实现过程(正序),一共…
注:本篇内容为翻译,之所以选择这篇进行翻译原因是该文章含有动画,能够更加直观地展示快速排序.同时,可以仔细看一下代码,代码中把结构化的思想给予了更加充分地表现.按照功能进行模块划分的思想得到了彻底地贯彻. 以下内容翻译自: http://cprogramminglanguage.net/quicksort-algorithm-c-source-code.aspx 译文: 在快速排序算法中,使用了分治策略.首先把序列分成两个子序列,递归地对子序列进行排序,直到整个序列排序结束. 步骤如下: 在序列…
相信算法对于许多开发人员来说都是一大难点,之所以难,就像设计模式一样,许多人在阅读之后,没有很好地理解,也不愿意动手上机操作,只停留在理论的学习上面,随着时间推移就慢慢淡忘. 有些东西,你可以发明创造,但是有些东西呢,你要么死记硬背,要么好好理解并动手进行练习来巩固.搞开发的话,死记硬背没用,好好理解火候还是差一点.最好的方式,还要在理解的基础上多敲敲代码,使自己即知其然,又知其所以然. 本篇只是简单介绍快速排序算法,大牛可以从旁帮忙指点,但是请嘴下留情哦:) 快速排序算法定义 快速排序(Qui…
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4046189.html 首先随机选择一个轴,并调整数组内各个数字,使得比轴值大的数在轴的右边,比轴小的数在抽的左边.然后在递归的对左边和右边进行快速排序. 在调整的过程中,可以使用交替填坑的算法. 例如对于序列 4 2 0 1 5 第一次随机选择轴值为3.那么首先把轴值与第一个数交换.并保存数值3,得到序列: 2  4  0  1  5 p                 q 现在取两个指针…
快速排序(Quick Sort)是对冒泡排序的一种改进,属不稳定排序算法,由东尼·霍尔在1962年提出.快速排序基本步骤:从数列中挑出一个元素(一般称为称为“基准”),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比基准小,另外一部分的所有数据都比基准大,与基准相等的数据可放在两部分中的任一部分,然后再按此方法递归地对这两部分数据分别进行处理,以达到整个数据变成有序序列.快速排序,最好情况下,时间复杂度为O(nlogn):最坏情况下,时间复杂度为O(n2):平均时间复杂度为…
快速排序算法思想: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 用一个算法排序图形象表示了快速排序 一趟快速排序的算法是: 1)设置两个变量i.j,排序开始的时候:i=0,j=N-1: 2)以第一个数组元素作为关键…
快速排序算法又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出.在平均状况下, 排序n个项目要O(nlogn)次比较.在最坏状况下则需要O(n*2)次比较,但这种状况并不常见.事实上,快速排序通常明显比 其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). 步骤为: 从数列中挑…
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https://www.cnblogs.com/ahalei/p/3568434.html 他是C语言实现,其实都是一样的. 我总结一个清晰不罗嗦版: 原理: 快速排序使用分而治之策略.下面描述递归步骤: 选择一个pivot支点值(在啊哈算法中叫“基准值”).我们将中间元素的值作为支点值,但是它也可以是任何值,…
数组的快速排序算法,和并归排序步骤基本类似. 都是先拆分,后合并.并归排序是:拆分容易,合并难. 快速排序是:拆分难,合并容易 要理解快速排序,首先要理解拆分逻辑 要素:找一个基准点,通过操作使得数列的左边全部都是小于他的数,右边全部都是大于他的数: 1.选中基准点,开始索引 i   ,结束索引  j 2.从数列右边开始往左边找,找到比基准点小的,交换位置 i++ 3.从数列左边开始往右边找,找到比基准点大的,交换位置 j-- 4.循环执行2.3,直到,i 不是小于 j 例如: 有数组  var…