c++ - 字符串插入排序

标签 c++ string sorting

我尝试使用插入排序根据中间三个字符对字符串数组进行排序。

代码可以编译但运行时崩溃

我正在对中间 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 的表达式中:

  1. 首先评估左条件
  2. 接下来会发生什么取决于左条件的评估结果:
    1. 如果 left-condition 为真,right-condition 将在秒内计算。
    2. 如果左条件为假,则跳过右条件的评估。

在您的情况下,问题在于表达式 (temp < ts[j]) && (j>=0)因为它实现了以下行为:

  1. 您首先使用 ts[j]在左边的表达式中;
  2. 然后在右表达式中测试 j>=0 ,所以 ts[j]不会出界。

简单的解决方案就是交换这些表达式的位置,并将表达式写为:(j >= 0 && temp < ts[j]) .

关于c++ - 字符串插入排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33373650/

相关文章:

c++ - 函数指针 typedef - 表达式必须是可修改的左值错误

java - 如何识别仅包含空格的字符串

c# - 子字符串和索引

sorting - 一个用于对通用集合进行排序的排序器函数

c++ - 根据类型标记字符串流

C++:替换字符串中控制字符的最佳方式

c - 回文 - 仅限 C 语言

java - java中按值对Map进行排序

java - 如何对不同类类型的对象数组进行排序?

c++ - 如何将 QMainWindow 设置为模式窗口?