菜鸟学排序:快速排序
2015-03-25 13:57
239 查看
今天来写一个快速排序。快速排序的核心就是选定一个基准数,然后分区,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。再对左右区间重复第二步,直到各区间只有一个数。
举个栗子,一组学生上体育课,需要重新按身高从高到底进行列队,这时候老师提出了一个方案(果然数学是体育老师教的(╯□╰)):
1.以当前队伍中队首的那个同学身高为标准,设为key,
2.先用队尾同学的身高与key比较,依次向前,直到找到第一个身高小于key的同学,我们称呼其为j同学
3.接着,从队首同学开始往后找,直到找到第一个身高大于key的同学,称呼其为i同学(为什么要先从后往前找呢?想想如果队首同学身高刚好最小的情况)
4.如果这时候i同学在队伍中的位置刚好是在j同学前面的,那么交换他们两个人的位置
5.交换完成后从i,j位置继续这个比较交换的过程,直到i = j,也就是比较到只剩一个人
6.交换队首同学与最后比较的同学的位置,此时,原队首同学当前位置前方全部是比他个矮的,身后全部是比他个高的
7.将原队首同学前面和后面分别视为两个新队伍,执行1-6步,直到每个新队伍都只剩下一个同学,这时候排序完成
看着很啰嗦,上图:
实现代码如下:
总结:看了严蔚敏《数据结构》中的实现和《啊哈,算法》中的,觉得后者更容易理解。
另外还有单项扫描的快速排序,以及非递归的实现,未继续深入。
水平有限,欢迎探讨指教
举个栗子,一组学生上体育课,需要重新按身高从高到底进行列队,这时候老师提出了一个方案(果然数学是体育老师教的(╯□╰)):
1.以当前队伍中队首的那个同学身高为标准,设为key,
2.先用队尾同学的身高与key比较,依次向前,直到找到第一个身高小于key的同学,我们称呼其为j同学
3.接着,从队首同学开始往后找,直到找到第一个身高大于key的同学,称呼其为i同学(为什么要先从后往前找呢?想想如果队首同学身高刚好最小的情况)
4.如果这时候i同学在队伍中的位置刚好是在j同学前面的,那么交换他们两个人的位置
5.交换完成后从i,j位置继续这个比较交换的过程,直到i = j,也就是比较到只剩一个人
6.交换队首同学与最后比较的同学的位置,此时,原队首同学当前位置前方全部是比他个矮的,身后全部是比他个高的
7.将原队首同学前面和后面分别视为两个新队伍,执行1-6步,直到每个新队伍都只剩下一个同学,这时候排序完成
看着很啰嗦,上图:
实现代码如下:
void quicksort(int a[], int left,int right) { if (left > right) { return; } int key = a[left]; int i = left; int j = right; while (i!=j) { //两端相遇,一趟扫描完成 while (a[j] >= key&&i < j) { //从队尾向前找到一个小于key的 j--; } while (a[i] <= key&&i < j) { //从队首先后找到一个大于key的 i++; } if (i < j) { a[i] = a[i] + a[j]; a[j] = a[i] - a[j]; a[i] = a[i] - a[j]; } } a[left] = a[i]; a[i] = key; quicksort(a, left, i - 1); quicksort(a, i + 1, right); }
总结:看了严蔚敏《数据结构》中的实现和《啊哈,算法》中的,觉得后者更容易理解。
另外还有单项扫描的快速排序,以及非递归的实现,未继续深入。
水平有限,欢迎探讨指教
相关文章推荐
- 菜鸟学排序----快速排序
- 编程菜鸟的日记-初学尝试编程-链表元素快速排序
- 菜鸟成长之快速排序
- 菜鸟学C语言三:快速排序与调用C语言库函数qsort()
- 菜鸟学习历程【15-3】快速排序
- 菜鸟学算法:输入输出文件的海量数据(快速排序,数组排序)
- Java程序员从笨鸟到菜鸟(二)Java实现冒泡排序、快速排序、插入排序、选择排序等基本排序方式
- QuickSort 快速排序
- 排序算法之快速排序
- 快速排序
- 七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)
- 快速排序C实现
- 快速排序
- 快速排序
- 快速排序的最简易实现
- 【CUDA自带实例学习】1.快速排序
- 快速排序实例
- Java快速排序
- 快速排序
- 白话经典算法系列之六 快速排序 快速搞定(转)