排序算法集合(3)- 快速排序原理及C#实现
来源:互联网 发布:怎样下载英语软件 编辑:程序博客网 时间:2024/06/10 00:22
快速排序的思想是:
1)初始输入值是一串乱序的数字S={s1, s2...sn}
2)选取某个逻辑位置的值为“中间值”(m),然后经过用S中的其他元素跟m比较:比m大的元素都调整到在“中间值”之前,其余的放置在“中间值”之后
-->现在,序列成了“准排序”状态,S被调整为S',分为三个部分P={p1, p2 ....} ,M={m}, Q= {q1, q2...},而这三个部分有P>M>Q的关系(P内任意元素>=m>=Q内任意元素)只不过在P,Q的内部还是乱序状态, 于是,我们如果将P,Q再进行排序,最后就能得到排序结果,而对P,Q的排序,我们可以递归调用快速排序算法
3)对P, Q分别递归调用快速排序算法进行排序,生成内部排序的P'和Q'.
-->递归的终止条件,就是某子序列内只有2个数,于是可以在一次比较(及必要的互换)之后,返回排序序列
4)返回P' + M + Q'
在第二步中,我们进行了N次比较,不过通过每次调用,都能达到将序列一分为二的目的,所以,分割的速度是指数增长的。一般认为快速排序的算法复杂度为N log(N);不过它是不稳定算法,最糟糕的情形仍然会达到N^2,这种最差情形,竟然是出在已排序序列上的。 对于一般的随机乱序而言,快速排序可以比较稳定的用 N*logN的时间复杂度完成。
还需要说明一下的是,具体实现快排算法时,注意利用数组位置的交换,而不用新引入其他数组作为存储空间。
好了,贴上一个本人的实现
1. 以队尾元素做中间值m,
2. 从1 到 n-1 扫描序列,比m大的元素不动(属于P),其余的跟Q序列倒数位置的元素交换,再继续比对;于是乎,P序列从头生成,Q序列从队尾(n-1处)逆向生成,当P,Q的指针相遇时,步骤2)完成
3. 递归P, Q; 返回P, M , Q
快拍实战非常强大,比如,某次在相同条件下开展benchmark,随机生成10,000个正整数进行排序,冒泡需要77ms, 快排序要0ms;
对于20,000个, 冒泡145 ms, 快排需要1ms. (由于n=20,000, logn=4*(1+.318), 而0.5n/logn=2000;实际上没有2000倍这么夸张了,是因为快排有很多对调的操作要占一些时间,但是快百倍还是有的,另外, N越大,二者效率相差的倍数就更大)。
- 排序算法集合(3)- 快速排序原理及C#实现
- 快速排序算法原理及java实现
- 快速排序算法原理及实现(单轴快速排序、三向切分快速排序、双轴快速排序)
- 【排序算法】快速排序原理及Java实现
- 快速排序算法(C#实现)
- C#实现快速排序算法
- C#快速排序算法实现
- c# 快速排序算法实现
- C#实现快速排序算法
- 【快速排序算法-C#实现】
- 排序算法集合(2)-C#实现的插入排序
- 快速排序算法及实现
- 快速排序算法及实现
- 数据结构——快速排序原理及算法Java实现
- 每日一算法之快速排序原理及实现
- 快速排序算法原理及java递归实现
- java快速排序算法实现及原理说明
- 快速排序算法原理及java递归实现
- MySQL InnoDB 存储引擎 基本参数
- IDC:IT业2013年前将有580万个新工作岗位
- FLASH Flex输入框不支持输入中文的问题
- flash特效原理:图片滑动放大效果
- struts2学习笔记(4)——数据类型转换
- 排序算法集合(3)- 快速排序原理及C#实现
- 防止sql注入,跨站脚本
- Ogitor编译
- C优先级的口诀
- box2d系列之创建b2Revolutejoint
- 整型到底占几个字节呢?
- 继续摘抄:一些做人做事的经验
- MFC 中实现窗口淡入淡出、逐步放大显示效果
- perl链接Oracle数据库