| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1882 人关注过本帖
标题:谁能用快速排序法编个程序啊?
只看楼主 加入收藏
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

//快速排序<C++版>
typedef unsigned char usc;
typedef unsigned long usl;

#include<iostream.h>
#include<stdlib.h>

static void swap(usc*p,usc*q)/*仅供Qsort()调用*/
{usc c=*p;*p=*q;*q=c;}/*故swap()不是public函数*/

void Qsort( /*快速排序函数*/
usc*LL, /*LL为待排序字符串的起始地址*/
usc*RR) /*RR为末字符(并非'\0')的地址*/
{ static usc*rr,cc;
auto usc*ll; /*因参与递归调用故ll为auto型*/
ll=LL;rr=RR;
if(ll>=rr) /*如果是空字符串或者只含一个*/
return; /*元素则可以认为排序业已完成*/
cc=*ll++; /*否则取首字符作区间划分基准*/
check1:if(ll==rr)/*若ll==rr则表示分区即将完成*/
goto equal; /*只剩(*ll)亦即(*rr)归属待定*/
renew:if(*ll<cc) /*若(*ll)<cc则归属"小数区间"*/
{ ll++; goto check1; }
check2:if(ll==rr)/*若ll==rr则表示分区即将完成*/
goto equal; /*只剩(*ll)亦即(*rr)归属待定*/
if(*rr>cc) /*若(*rr)>cc则归属"大数区间"*/
{ rr--; goto check2; }
swap(ll++,rr--); /*有点像一对一战俘交换*/
/*至此[LL,ll-01]为小数区,[rr+01,RR]为大数区*/
if(ll<rr)goto renew;
/*若ll<rr则至少有两个元素的归属待定,转renew*/
else if(ll>rr)goto digui;/*实际是ll-rr==1*/
/*若ll-rr==1则表示所有元素的归属都已确定,故转
递归调用.注意因swap()前恒有LL<ll<rr<=RR所以
swap(ll++,rr--)后,LL<rr<ll<=RR,即"小数区间"
[LL+1,rr]与"大数区间"[ll,RR]都至少有1个元素
(如果基准元素*LL既不算大数也不算小数的话)*/
equal: /*以下确定(*ll)即(*rr)的归属
此时的情况是LL<rr==ll<=RR.在"最坏"的情况下
①如果(*rr)>cc,那么"小数区间"有可能是空集!
②如果(*ll)<cc,那么"大数区间"有可能是空集!
为避免无限递归,针对情况①②的解决方案如下:
①将基准元素(*LL)划入"小数区间"即[LL,ll-1]
②对调(*LL)与(*ll),令"大数区间"为[ll,RR].*/
if(*ll<cc)swap(LL,ll);////本语句顶以下五行
//// if(*ll<cc)ll++;else rr--;
//// if(rr==LL)//若"小数区间"为空集
//// { Qsort(LL+1,RR);return; }
//// if(ll>RR) //若"大数区间"为空集
//// { swap(LL,RR);Qsort(LL,RR-1);return; }
digui: /*以下递归调用先后顺序不限*/
Qsort(ll,RR); /*因参与递归ll应为auto属性*/
Qsort(LL,ll-1);/*原则上ll-1也可用rr替换之*/
/*但那样做要求rr为auto属性*/
}

int main()
{
usl NUM,i;
usc *s,*p;
cout<<"NUM=";
cin >> NUM;
p=s=new usc[NUM+1];
for(i=0; i<NUM; i++)
s[i]=rand()%96+32;
s[NUM]='\0';

Qsort(s,&s[NUM-1]);

while(*p)cout<<*p++;
cout<<endl;
delete[]s;
return 0;
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-04 15:21
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
很可怕,看不懂,
后果很严重~!

对不礼貌的女生收钱......
2006-05-04 16:10
仁者无敌
Rank: 1
等 级:新手上路
帖 子:199
专家分:0
注 册:2006-3-5
收藏
得分:0 

C++吗?看不懂!


I am a programmer !
2006-05-04 16:39
ma2006
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-5-2
收藏
得分:0 
顶!看不懂这么长代码。
2006-05-04 16:58
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
/*这是"希尔排序",速度也很快哩*/
void Shell(int array[],unsigned num)
{ int new,*p,*q,*r,*right=array+num;
unsigned dis=num;
while(1)
{ dis=dis/2.71828;
if(dis==0)break;
if(dis==2)++dis;
for(r=array+dis;r<right;r++)
{ new=*r;
for(p=r;;p=q){
q=p-dis;
if(q<array)break;
if(*q<=new)break;
*p=*q;}
*p=new;
}
}
}
#include<stdlib.h>
#define NUM 20000
main(){ int a[NUM],i;
srand(time(NULL));
for(i=0;i<NUM;i++)a[i]=rand();
Shell(a,NUM);
for(i=0;i<NUM;){
printf("%6d",a[i++]);
if(i%10==0)printf("\n");}
}

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-04 17:12
herotobe
Rank: 1
等 级:新手上路
威 望:1
帖 子:48
专家分:0
注 册:2006-5-3
收藏
得分:0 

高高


After all,tomorrow is another day!!!!
2006-05-05 22:48
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
收藏
得分:0 

四楼修改如下:
[CODE]
#include "stdio.h"
#include "stdlib.h"

#define M 11

int Data_cmp(const void *x,const void *y)
{
return *(int *)x-*(int *)y;
}

int main( )
{
int d[M]={5,6,8,7,1,2,3,4,8,9,5},i;

qsort(d,M,sizeof(int),Data_cmp);
for(i=0;i<M;i++)
printf("%d ",d[i]);
return 0;
}

[/CODE]


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-05-06 00:09
白水
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2006-5-4
收藏
得分:0 
。。。。。学习ing
2006-05-06 08:58
oヤ偽妳變壞
Rank: 2
等 级:新手上路
威 望:4
帖 子:2251
专家分:0
注 册:2006-3-19
收藏
得分:0 

上面有个函数我也是第一次看见!

2006-05-06 09:37
仁者无敌
Rank: 1
等 级:新手上路
帖 子:199
专家分:0
注 册:2006-3-5
收藏
得分:0 
以下是引用feng1256在2006-5-6 0:09:00的发言:

四楼修改如下:
[CODE]
#include "stdio.h"
#include "stdlib.h"

#define M 11

int Data_cmp(const void *x,const void *y)
{
return *(int *)x-*(int *)y;
}

int main( )
{
int d[M]={5,6,8,7,1,2,3,4,8,9,5},i;

qsort(d,M,sizeof(int),Data_cmp);
for(i=0;i<M;i++)
printf("%d ",d[i]);
return 0;
}

[/CODE]

这是快速排序法吗?


I am a programmer !
2006-05-07 11:33
快速回复:谁能用快速排序法编个程序啊?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026242 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved