写在前面:
排序又称为分类,它是数据处理中经常用到的一种重要运算。
虽然并未列入世界最伟大的几大算法之一,但毫无疑问,在各行各业的各个时期排序都是作为奠基者般的存在为程序所调用,也为编程者所敬仰。只是,也许正是因为它与我们息息相关,以至于我们竟然时常忽略它的存在。
事实上我们生活中无时无刻不在做排序:考试成绩排名,按身高、年龄、能力高低去评判他人,划分任务处理的优先级,等等·······
前面3篇博客我们讨论了简单插入排序、简单选择排序和冒泡排序算法,而今天我们进入排序小能手“快速排序”的学习,一步步去探索排序算法如何在反思中前进,在山重水复处柳暗花明。
我们已经认识到,无论是简单插入排序、简单选择排序还是冒泡排序,复杂度都是O[n^2],它们能力就算有高低,到底还是同一个维度的竞争对手。我说你比我慢,不过是五十步笑一百步。那么有没有一种新的算法可以直接将复杂度降下来呢?
有,它就是排序中的降维打击战略武器——快排。
那快排是什么又是怎么想出来的呢?
所谓快排,又叫做分区交换,它是目前已知平均速度较快的一种排序算法。值得注意的是,它是对冒泡排序算法的一种改进(纳尼!)。
快速排序的基本思想是:
从待排序的n个数据中选取一个元素Ri(可选第一个数据,也可选中间的数据)作为标准,调整序列中各个元素的位置,使得排在Ri前面的元素值都小于Ri,排在Ri后面的元素值都大于Ri,这样的过程叫做一次快速排序。第一次快排过程,确定了Ri最终在序列中的位置,同时把剩下的元素分为两个子序列。对于2个子序列再分别进行快排,又可以确定2个元素在序列中的最终位置,并将序列分为了4个子序列。依次类推,当各序列只有一个数据元素时,则整个序列已然有序,排序完毕。
我们将算法用规范的C语言代码描述如下(假设数据类型为double):
void quicksort(double