也从排序谈起之 快速排序(2)
来源:互联网 发布:接口授权源码 编辑:程序博客网 时间:2024/04/30 04:48
上篇文章分析了基本的快速排序思想,这里也不打算再深入进去了,就这个快速排序的实现来说,就已经有了很多值得思考的东西。
我大概总结了3点:
1、关于排序中相等情况的处理
2、关于快速排序中上界、下界的选择(即lptr,rptr选哪一个)
3、由快速排序想到的快速查找,比如常用的查找集合S中的最小元,最大元问题。
分析如下:
1、排序中元素相等情况的处理
不健壮的算法实现对于不挑剔的测试数据来说总是很容易能得到正确的结果,但是,如果我们加大测试力度,比如增加数据数量,或者
改变测试策略,将数据相等的情况考虑进去,那么这个时候,算法就很容易出错了。
上篇文章给的程序实现是能正确处理这种情况的,不论lptr或者rptr,只要遇到和a[right]相等的元素,都会停下来,以交换lptr和rptr指向的
元素,这样看,表面上是增加了很多不必要的交换操作,实际上它使集合总体上趋于平衡。关于具体的比较,数据结构教程上都讲的比较
详细,我这也不抄袭了。就是想强调下排序过程中特殊情况的处理。
2、考虑到lptr,rptr的运动规律,当二者停止运动的时候,只有两种情况存在,记lptr与rptr指向了同一元素,或者lptr运动到了rptr的右边,
所以这时候显而易见,lptr既然在,其指向的元素肯定比a[right]大,故交换s[lptr]与s[right],没有任何问题。但rptr此时指向的元素肯定
小于a[right],所以不能用a[rptr]与a[right]进行交换。
或者当我们从最开始选择a[pivot]与a[left]交换,那么此时,情况就正好相反,应该取a[rptr]与a[left]交换。原因同上
3、快速排序问题
当我们要在集合S中寻找第K个最小元或最大元的时候,那么对整个集合进行排序,显然不是一个好的办法。一种好的解决方案是使用
堆排序,建立一个堆,然后依次删除K-1次根节点之后,当前的根节点元素肯定就是要求的元素。第二种好的方案就是使用快速排序,
因为我们每次选取中间节点进行分割,S被分割成S1和S2之后,S1中所有元素肯定小于S2,此时S1是从0-(lptr-1),S2是从(lptr+1)-right,
所以K如果在S1中,那么就不需要对S2再进行排序,如果在S2中,就不需要对S1进行排序,如果K==lptr,那么再好不过,它就是我们
要找的元素。
以下是快速选择的一种实现
------------------------------------------------------------------------------------------------
10 void qselect(int a[],int left,int right,int K)
11 {
12 int lptr,rptr;
13 int pviot = (left+right)/2;
14
15 if(left < right)
16 {
17 lptr = left;
18 rptr = right -1;
19 swap(a,pviot,right);
20 for(;;)
21 {
22 for(;a[lptr] < a[right];lptr++);
23 for(;a[rptr] > a[right];rptr--);
24
25 if(lptr < rptr)
26 {
27 swap(a,lptr,rptr);
28 lptr++;
29 rptr--;
30 }
31 else
32 break;
33 }
34 swap(a,lptr,right);
35
36 if(K < lptr)
37 qselect(a,left,lptr-1,K);
38 else if(K > lptr)
39 qselect(a,lptr+1,right,K-lptr-1);
40 }
41 }
int main(void)
{ ......
56 qselect(a,0,N-1,K-1);......}
------------------------------------------------------------------------------------------------
- 也从排序谈起之 快速排序
- 也从排序谈起之 快速排序(2)
- 排序算法之--从冒泡排序到快速排序
- 排序之快速排序
- 排序之 快速排序
- 排序之快速排序
- 排序之------快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之-----快速排序
- sql语句添加约束(转)
- 将数据库中的数据用java程序导出成Excel
- Windows Workflow Foundation Web Workflow Approvals Starter Kit(转)
- Visual Studio 即时窗口
- 这是一种境界
- 也从排序谈起之 快速排序(2)
- C# 控制音量 (滚动条形式)
- 办深户,找易通!
- 关于在cs文件中输出js的alert代码
- 开拓梦想之地的不老顽童
- dos环境下删除文件命令
- tomcat6.0下中文字符转换的疑似bug
- KDM fails to start(我遇到这个问题的时候没找到这个东西,改用slim 启动,现摘录如下,正确于否,待证)
- 下面是我搜集的一些精妙的SQL语句