我试图使用插入排序根据中间三个字符对字符串数组进行排序。
代码编译但在运行时崩溃
我正在排序中间3个字符的数组,并且还对存储字符串索引的数组进行排序。 这样在打印最终结果时我可以得到一个排序数组
void ins(string a[size],int n)
{
int i,j,k,length[size],index[size],m,t;
string temp,ts[size]; // ts[] stores the middle 3 characters
for(i=0;i<n;i++)
{
index[i]=i;
}
for(i=0;i<n;i++)
{
length[i]=a[i].length();
}
for(i=0;i<n;i++)
{
m=length[i]/2;
ts[i]=a[i].substr(m-1,3);
}
for(i=0;i<n;i++)
cout<<ts[i]<<endl;
for(k=1;k<n;k++)
{
temp=ts[k];
t=index[k];
j=k-1;
while((temp < ts[j]) && (j>=0))
{
ts[j+1]=ts[j];
index[j+1]=index[j];
j=j-1;
}
ts[j+1]=temp;
index[j+1]=t;
}
for(i=0;i<n;i++)
{
cout<<a[index[i]]<<endl;
}
}
主
int main()
{
int n,i,j,k,num;
string a[size];
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
}
ins(a,n);
}
你可以帮我找一下这个bug
答案 0 :(得分:2)
表格left-condition && right-condition
:
在您的情况下,问题在于表达式(temp < ts[j]) && (j>=0)
,因为它实现了以下行为:
ts[j]
; j>=0
的右表达式进行测试,以便ts[j]
不会超出范围。解决方案只是交换这些表达式的位置并将表达式写为:(j >= 0 && temp < ts[j])
。