【问题标题】:Insertion Sort on a String Array对字符串数组进行插入排序
【发布时间】:2020-11-12 06:24:07
【问题描述】:

我无法将插入排序算法应用于字符串,因为它。我收到了各种错误,我认为这些错误来自关于字符串与字符类型的问题。

例如:

candidate template ignored: could not match 'stack' against 'basic_string'
operator> (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)

插入排序算法是从 geeks for geeks 中提取的,但我只是将其更改为字符串数组。

void insertionSort(string arr[], int n)
{
    int i, key, j, unsortedness;
    for (i = 1; i < n; i++)
    {
        key = arr[i];
        j = i - 1;
        
        /* Move elements of arr[0..i-1], that are  
         greater than key, to one position ahead  
         of their current position */
        while (j >= 0 && arr[j] > key)
        {
            arr[j + 1] = arr[j];
            j = j - 1;
    
        }
        
        arr[j + 1] = key;
    }
}

int main()
{
    
    //Read in from file stuff missing to save space
    
    int d, lengthStrings, numberStrings; // D will hold the number of data sets
    infile >> d;
    cout << d << endl;
    while (d != 0)
    {
        infile >> lengthStrings;
        infile >> numberStrings;
        int numCopy = numberStrings;
        
        int i = 0;
        string arrayDna[numberStrings]; //char arrayDna[numberStrings][lengthStrings] instead?;
        
        while (numberStrings != 0)
        {
            infile >> arrayDna[i];
            i++;
            numberStrings--;
        }
        
        insertionSort(arrayDna[], numCopy);

        for (int i = 0; i < numCopy; i++)
            cout << arrayDna[i] << "\n";
        
        d--;

所以基本上我需要帮助修复不允许我将此插入算法应用于我自己的字符串数组的错误。

【问题讨论】:

  • 是什么让您认为插入排序非常适合这项任务?
  • 老师的作业
  • 在对一组事物进行排序之前,您必须能够比较两个事物。由于您想按“度量”或“未排序”对事物进行排序,因此您必须编写代码来计算序列的度量。一旦你有了它,你可以修改这个插入排序来比较两个事物的度量,而不是比较事物本身。
  • @101001 -- 你用错了方法。正如 Beta 所提到的,如果您无法从逻辑上弄清楚是什么使一个字符串小于另一个字符串,那么无论您尝试执行哪种类型的排序,排序代码都不存在。
  • 加上将两者结合意味着您必须同时调试两种算法。这听起来困难两倍,但事实并非如此。通常它会呈指数增长。保持小而简单且可单独测试,然后像乐高积木一样组装。

标签: c++ arrays sorting insertion-sort


【解决方案1】:

我没有处理逻辑,但希望清除所有基本错误:)

变化:

(1) arrayDna[] => arrayDna(在参数中)同时调用 insertionSort 函数。

(2) 在insertionSort 函数中的行:key = arr[i],

keyint 类型但需要 string 类型,因此将 key 的类型从 int 更改为 string

void insertionSort(string arr[], int n)  
 {  
int i,j, unsortedness;  
string key;
for (i = 1; i < n; i++) 
{  
    key = arr[i];  
    j = i - 1;  

    /* Move elements of arr[0..i-1], that are  
    greater than key, to one position ahead  
    of their current position */
    while (j >= 0 && arr[j] > key) 
    {  
        arr[j + 1] = arr[j];  
        j = j - 1;
    // Since I just need to find unsortedness and not actually sort 
    //I should probably just replace the two lines with something such as  
    //unsortedness++ and compare that way
    }  

    arr[j + 1] = key;  
   }  
 }  



 int main(){

 //Read in from file stuff missing to save space

int d,lengthStrings, numberStrings;     // D will hold the number of data sets
infile >> d;
cout << d << endl;
while(d !=0){
    infile >> lengthStrings;
    infile >> numberStrings;
    int numCopy=numberStrings;

    int i=0;
    string arrayDna [numberStrings]; //char arrayDna[numberStrings][lengthStrings] instead?;
    


    while(numberStrings != 0){
        infile >> arrayDna[i];
        i++;
        numberStrings--;
    }
    
    insertionSort(arrayDna, numCopy);

 for (int i = 0; i < numCopy; i++) 
        cout << arrayDna[i] << "\n";

    
    d--;
    }
  }

【讨论】:

  • 代码是一团糟,但问题的重要部分是逻辑上的漏洞。如果你不解决这个漏洞,那么答案并不会太有用。
  • 谢谢 Sai,我只需要弄清楚为什么我不能将它应用到我的字符串数组。它现在按顺序对其进行排序。我现在就去弄清楚如何根据未排序进行排序。泰
  • 看起来我想多了被问到的问题。一项要求:突出显示您所做的更改,并在必要时解释更改。
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 2018-08-17
  • 2014-05-11
  • 2016-07-18
  • 1970-01-01
相关资源
最近更新 更多