读书人

快速排序 兑现

发布时间: 2013-01-05 15:20:39 作者: rapoo

快速排序 实现
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1159

一道要用到快排的ACM题目 下面的代码能AC 但我是借助vector和algorithm里面的排序
我想自己写个 但不知道为什么出现了vector 越界了
求指点

#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<queue>
#include<vector>
#include<algorithm>
#include<string>
#include<math.h>
#include<functional>
using namespace std;
int n,m;
void quicksort(vector<string>&v,int left,int right)
{
string s,str;
int i,j;
if(left<right)
{
i=left;
j=right+1;
str=v[left];
do
{
do
{
i++;
}while(v[i]<str);
do
{
j--;
}while(v[j]>str);
if(i<j)
{
s=v[i];
v[i]=v[j];
v[j]=s;
}
}while(i<j);
s=v[left];
v[left]=v[j];
v[j]=s;
quicksort(v,left,j-1);
quicksort(v,j+1,right);
}
}
int main()
{
int T;
scanf("%d",&T);
for(int i=0;i<T;i++)
{
scanf("%d",&n);
vector<string>v;
string s;
for(int j=0;j<n;j++)
{
cin>>s;
int len=s.size();
string temp="";
for(int k=0;k<len;k++)
{
if(s[k]>='0'&&s[k]<='9')
temp+=s[k];
else if(s[k]=='A'||s[k]=='B'||s[k]=='C')
temp+='2';
else if(s[k]=='D'||s[k]=='E'||s[k]=='F')
temp+='3';
else if(s[k]=='G'||s[k]=='H'||s[k]=='I')
temp+='4';
else if(s[k]=='J'||s[k]=='K'||s[k]=='L')
temp+='5';
else if(s[k]=='M'||s[k]=='N'||s[k]=='O')
temp+='6';
else if(s[k]=='R'||s[k]=='S'||s[k]=='P')
temp+='7';
else if(s[k]=='T'||s[k]=='U'||s[k]=='V')
temp+='8';
else if(s[k]=='W'||s[k]=='X'||s[k]=='Y')
temp+='9';

}
temp+='\0';
v.push_back(temp);
}
/*int flag;
for(int j=0;j<n;j++)
{
flag=j;
for(int k=j+1;k<n;k++)
{
if(v[flag]>v[k])
{
flag=k;
}
}
if(flag!=j)
{
string str=v[j];
v[j]=v[flag];
v[flag]=str;
}
}*/
//quicksort(v,0,n-1);//这里实现快排 为什么编译出现vector 越界啊
sort(v.begin(),v.end());
int sum=1;
int flag=0;
string str=v[0];
for(int j=1;j<n;j++)
{
if(str==v[j])
sum++;
else
{
if(sum!=1)
{
flag=1;
cout<<str[0]<<str[1]<<str[2]<<"-"<<str[3]<<str[4]<<str[5]<<str[6]<<" "<<sum<<endl;
sum=1;
str=v[j];
}
else
{
sum=1;
str=v[j];
}
}
}
if(sum!=1)
{
flag=1;
cout<<str[0]<<str[1]<<str[2]<<"-"<<str[3]<<str[4]<<str[5]<<str[6]<<" "<<sum<<endl;
}
if(flag==0)
printf("No duplicates.\n");
if(i<T-1)printf("\n");
}
return 0;
}




[解决办法]
if(s[k]>='0'&&s[k]<='9')                     temp+=s[k];                 else if(s[k]=='A' 


[解决办法]
s[k]=='B'
[解决办法]
s[k]=='C') temp+='2'; else if(s[k]=='D'
[解决办法]
s[k]=='E'
[解决办法]
s[k]=='F') temp+='3'; else if(s[k]=='G'
[解决办法]
s[k]=='H'
[解决办法]
s[k]=='I') temp+='4'; else if(s[k]=='J'
[解决办法]
s[k]=='K'
[解决办法]
s[k]=='L') temp+='5'; else if(s[k]=='M'
[解决办法]
s[k]=='N'
[解决办法]
s[k]=='O') temp+='6'; else if(s[k]=='R'
[解决办法]
s[k]=='S'
[解决办法]
s[k]=='P') temp+='7'; else if(s[k]=='T'
[解决办法]
s[k]=='U'
[解决办法]
s[k]=='V') temp+='8'; else if(s[k]=='W'
[解决办法]
s[k]=='X'
[解决办法]
s[k]=='Y') temp+='9';




这代码写的风格,太丑了,你就不能根据ASC码来判断范围吗?

j=right+1;
while(v[j]>str);//这句j就越界了。
quicksort(v,0,n-1);
[解决办法]

void exchange(int &a,int &b)
{
int t=a;


a=b;
b=t;
}

int partion1(int a[],int p,int r)
{
int z=a[r];int t;
int m=p;
for(int i=p;i<r;i++)
{
if(a[i] <= z)
{
exchange(a[i],a[m]);
m++;
}

}
exchange(a[r],a[m]);
return m;
}


void quickSort(int a[],int p,int r)
{
if(p<r)
{
int z = partion2(a,p,r);
quickSort(a,p,z-1);
quickSort(a,z+1,r);
}
}

读书人网 >软件架构设计

热点推荐