排序算法集合(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越大,二者效率相差的倍数就更大)。

原创粉丝点击