动物世界

快速排序的两个基本变种

快速排序的变种:

调试了半天,看啦人家的代码,知道错误之所在,值得参考,记得无论是随机后的值还是平衡快排max3()的值都要和star交换位置,否则的话,会有错误的.这都是本菜的教训..

随机快排:
随机快排的基本思想:每次确定key的时候,用随机数确定其位置

#include<iostream>
#include<ctime>
using namespace std;
int map[50];
int n;
bool sure()
{
int i;
bool flag=true;
for(i=0;i<n-1;i++)
if(map[i]>map[i+1]){
flag=false;break;
}
return flag;
}
int rand(int p,int q)
{
int key;
srand(time(0));
key=p+rand()%(q-p+1);
return key;
}
void swap(int a,int b)
{
int temp=map[a];
map[a]=map[b];
map[b]=temp;
}
void dochange(int star,int end)
{
int i,j;
int k;
int key,weizhi;
bool flag=true;
if(star>=end)return;
weizhi=rand(star,end);
key=map[weizhi];
swap(star,weizhi);

weizhi=star;
i=star;j=end;
while(i<=j)
{
if(flag){
if(map[j]<key){
swap(weizhi,j);
weizhi=j;flag=false;
}j--;
}
else{
if(map[i]>key){
swap(weizhi,i);
weizhi=i;flag=true;
}i++;
}
}

if(sure())return;
else{
if(weizhi==star)dochange(star+1,end);
else if(weizhi==end)dochange(star,end-1);
else{
dochange(star,weizhi-1);
dochange(weizhi+1,end);
}
}
}
int main()
{
int i;
while(cin>>n&&n)
{
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
cin>>map[i];
dochange(0,n-1);
for(i=0;i<n;i++)
cout<<map[i]<<' ';
cout<<endl;
}
return 1;
}

平衡快速排序
平衡快排的基本思想:low,mid,high取位置上元素大小居中的元素为key

#include<iostream>
using namespace std;
int map[50];
int n;
bool sure()
{
int i;
bool flag=true;
for(i=0;i<n-1;i++)
if(map[i]>map[i+1]){
flag=false;break;
}
return flag;
}
int max2(int a,int b)
{
if(map[a]>map[b])return a;
return b;
}
int max3(int a,int b,int c)
{
int i;
int max=max2(max2(a,b),c);
if(max==a)i=max2(b,c);
else if(max==b)i=max2(a,c);
else i=max2(a,b);
return i;
}
void swap(int a,int b)
{
int temp=map[a];
map[a]=map[b];
map[b]=temp;
}
void balchange(int star,int end)
{
int i,j;
int mid=(star+end)/2;
int key;
int weizhi=max3(star,mid,end);
bool flag=true;
if(star>=end)return ;
swap(weizhi,star);
weizhi=star;
key=map[weizhi];
i=star;j=end;
while(i<=j){
if(flag){
if(map[j]<key){
swap(weizhi,j);
weizhi=j;
flag=false;
}j--;
}
else{
if(map[i]>key){
swap(weizhi,i);
weizhi=i;
flag=true;
}i++;
}
}
if(sure())return;
else{
if(weizhi==star)balchange(star+1,end);
else if(weizhi==end)balchange(star,end-1);
else{
balchange(star,weizhi-1);
balchange(weizhi+1,end);
}
}
}
int main()
{
int i;
while(cin>>n&&n)
{
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
cin>>map[i];
balchange(0,n-1);
for(i=0;i<n;i++)
cout<<map[i]<<' ';
cout<<endl;
}
return 1;
}


 

posted on 2012-01-20 22:14  动物世界  阅读(354)  评论(0)    收藏  举报

导航