我尝试使用插入排序根据中间三个字符对字符串数组进行排序。
代码可以编译但运行时崩溃
我正在对中间 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);
}
你能帮我找出错误吗
最佳答案
在形式为 left-condition && right-condition
的表达式中:
- 首先评估左条件;
- 接下来会发生什么取决于左条件的评估结果:
- 如果 left-condition 为真,right-condition 将在秒内计算。
- 如果左条件为假,则跳过右条件的评估。
在您的情况下,问题在于表达式 (temp < ts[j]) && (j>=0)
因为它实现了以下行为:
- 您首先使用
ts[j]
在左边的表达式中; - 然后在右表达式中测试
j>=0
,所以ts[j]
不会出界。
简单的解决方案就是交换这些表达式的位置,并将表达式写为:(j >= 0 && temp < ts[j])
.
关于c++ - 字符串插入排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33373650/