主题:关于第29次编程比赛第1题的结果
zhiyanglee [专家分:0] 发布于 2006-06-04 13:28:00
冠军是[color=FF0000]yunzhou008[/color]
算法分析:
简单排序:
xieyong456(算法没错,题目理解不同,输出不一样,我的问题),
maobingwen(在temp交换那里错误),
hmlb(错误),
廖增祥(思想是对的,但你想的跟你做的不一样),
laoqiang(没有返回)
fantasyzzz(用到了stl,但存在效率问题,思想跟廖增祥一样,廖增祥可以看一下)
pigeonoo(正确,只是效率问题)
堆排:scyangbo(正确,主要耗时用在建堆上)
快速排序:
fenix(跟我的本意不一样,但在排序上用qsort()肯定不会有问题啦)
ITER(qsort()毫无疑问的正确)
手写快排:
yunzhou008(第一个有问题,第二个正确)
类似快排(个人认为比较好的算法):
johnywoo(有问题,很遗憾)
新颖算法:
fenix(跟我的本意不一样,但思想上跟iAkiak一样),
iAkiak(有问题,第二个循环的i是i++,不是i--),
爱与恨007(小规模数据没问题,但数据一大就有问题)
比较另类算法:
火海时代(正确)
算法思想没错,但写错了:天国龙(wrong)
写得最认真的程序:
goal00001111(可惜程序结果有问题)
冒泡加快排:
Atins(有问题)
有些人在题目理解上跟我的本意不一样,所以我只看算法。
其他人请用这个测试程序检验一下。
特别是goal00001111,你的程序写得很好,很认真,很复杂。但如果下面序列长度比较大,测试次数多点时就会检验都有错误。
yunzhou008 自己写快排,还算认真,最重要还保证了正确性.所以我给他冠军。
其实火海时代也不错,不过看得不是很明白,
scyangbo用到堆排也蛮好的,但是建堆加K次移堆,直接快排更快。
ITER用到了内部函数,正确性毫无疑问,但ITER算是这里的常客了,冠军就不给了
这只是初步结果,如果大家对结果有什么意见,可以提出
下面是测试程序:
#include<iostream>
using namespace std;
//在此处添加你的函数
inline int Random(int min,int high);
int Partition(int List[],int low,int high);
void Quicksort(int List[],int low,int high);
int main()
{
const int MAX=1000;
const int COUNT=1000;
int List[MAX],L[MAX],len,k,i,j;
srand((unsigned)time(NULL));
for(j=0;j<COUNT;j++)
{
len=(int)((double)rand()/RAND_MAX*(MAX-1))+1;//creat lengeth of List
k=(int)((double)rand()/RAND_MAX*(len-1))+1;//creat int k
for(i=0;i<len;i++)//creat List
{
List[i]=Random(0,MAX);
L[i]=List[i];
}
Quicksort(L,0,len-1);
if(L[k-1]!=KthNumOfList(List,len,k))//test
break;
}
if(j==COUNT)
cout<<"Correct!"<<endl;
else
{
cout<<"Wrong!"<<endl;
cout<<"len = "<<len<<" k = "<<k<<endl;
for(i=0;i<len;i++)
cout<<L[i]<<' ';
cout<<endl;
cout<<"Your answer = "<<KthNumOfList(List,len,k)<<endl;
cout<<"and the correct answer = "<<L[k-1]<<endl;
}
getchar();
getchar();
return 0;
}
int Partition(int List[],int low,int high)
{
int pivot=List[low];
while(low<high)
{
while(low<high && List[high]>=pivot)
high--;
List[low]=List[high];
while(low<high && List[low]<=pivot)
low++;
List[high]=List[low];
}
List[low]=pivot;
return low;
}
void Quicksort(int List[],int low,int high)
{
if(low<high)
{
int pivot=Partition(List,low,high);
Quicksort(List,low,pivot-1);
Quicksort(List,pivot+1,high);
}
}
inline int Random(int min,int max)
{
return (int)((double)rand()/RAND_MAX*(max-min))+min;
}
回复列表 (共33个回复)
沙发
zhiyanglee [专家分:0] 发布于 2006-06-04 01:33:00
另外附上我自己写的程序(思想同johnywoo一样,快排的变种,比较经典的算法)
#include<iostream>
using namespace std;
inline int Random(int min,int high);
int Kquicksort(int List[],int low,int high,int k);
int myKthNumOfList(int List[],int len,int k);
int Partition(int List[],int low,int high);
void Quicksort(int List[],int low,int high);
int main()
{
const int MAX=1000;
const int COUNT=1000;
int List[MAX],L[MAX],len,k,i,j;
srand((unsigned)time(NULL));
for(j=0;j<1000;j++)
{
len=(int)((double)rand()/RAND_MAX*(MAX-1))+1;//creat lengeth of List
k=(int)((double)rand()/RAND_MAX*(len-1))+1;//creat int k
//cout<<"len = "<<len<<" k = "<<k<<endl;
for(i=0;i<len;i++)//creat List
{
List[i]=Random(0,MAX);
L[i]=List[i];
}
Quicksort(L,0,len-1);
if(L[k-1]!=myKthNumOfList(List,len,k))//test
break;
}
if(j==COUNT)
cout<<"Correct!"<<endl;
else
cout<<"Wrong!"<<endl;
getchar();
getchar();
return 0;
}
int Partition(int List[],int low,int high)
{
int pivot=List[low];
while(low<high)
{
while(low<high && List[high]>=pivot)
high--;
List[low]=List[high];
while(low<high && List[low]<=pivot)
low++;
List[high]=List[low];
}
List[low]=pivot;
return low;
}
void Quicksort(int List[],int low,int high)
{
if(low<high)
{
int pivot=Partition(List,low,high);
Quicksort(List,low,pivot-1);
Quicksort(List,pivot+1,high);
}
}
inline int Random(int min,int max)
{
return (int)((double)rand()/RAND_MAX*(max-min))+min;
}
int Kquicksort(int List[],int low,int high,int k)
{
int pivot=Partition(List,low,high);
if(pivot-low+1==k)
return List[pivot];
else if(pivot-low+1<k)
return Kquicksort(List,pivot+1,high,k-pivot+low-1);
else
return Kquicksort(List,low,pivot-1,k);
}
int myKthNumOfList(int List[],int len,int k)
{
return Kquicksort(List,0,len-1,k);
}
板凳
wellerweldon [专家分:60] 发布于 2006-06-04 02:06:00
赞一下楼主,那么晚了还在忙着[em11]
3 楼
flyee [专家分:340] 发布于 2006-06-04 02:07:00
没人用heap?
4 楼
爱与恨007 [专家分:110] 发布于 2006-06-04 10:25:00
我的有什么问题啊说清楚一点
我测试没有问题啊
我在vc6.0下测试的
你用什么测试我的有问题
5 楼
爱与恨007 [专家分:110] 发布于 2006-06-04 10:49:00
测试程序在我用的vc6.0上编译不过
更不要说测试了
哎郁闷啊真不知道楼主怎么测试的
6 楼
sarrow [专家分:35660] 发布于 2006-06-04 10:52:00
不要使用VC6!
这里的编程比赛一般都使用GCC编译器!
7 楼
goal00001111 [专家分:4030] 发布于 2006-06-04 10:58:00
很奇怪,为什么会出错,感觉算法没有错误,因为我是从一个教材的经典算法改过来的.
8 楼
ITER [专家分:680] 发布于 2006-06-04 11:07:00
算了 不说了 等下次喽~ 希望下次题目好玩点
9 楼
sarrow [专家分:35660] 发布于 2006-06-04 11:10:00
我发现啊!
看每次比赛的答题结果,若发现某人写得特别多,那么多半是goal00001111兄的!
先不说别的,就goal00001111兄你这股认真劲儿,就挺让人佩服的!
10 楼
fenix124 [专家分:70] 发布于 2006-06-04 11:24:00
我写的第二个程序某句打字太快写错了,也没有检查,具体和iAkiak的比较一下就知道了.
的确是题意理解有问题
我来回复