【问题标题】:C++ Issues Bubble Sorting a 2D char ArrayC++ 问题对 2D 字符数组进行冒泡排序
【发布时间】:2012-11-03 16:26:22
【问题描述】:

这个问题是关于我为作业编写的代码,所以是的,我必须使用冒泡排序,是的,我必须使用数组。

好的,所以我对一维数组进行了很好的冒泡排序,但是尝试对两个数组进行排序让我很伤心。

我要做的是将姓名列表(即乔、鲍勃、贝蒂、杰克)按字母顺序排序。使用以下代码,程序会尝试对事物进行排序(名称四处移动),但通常只是部分正确。

#include <iostream>
#include <fstream>
using namespace std;
void AlphaSort(char [][50]);
void GetInput(char [][50]);
void PrintArray(char [][50]);

int main()
{
    char name[4][50];
    cout << "Please enter 4 names:\n";
    GetInput(name);
    cout << endl << "The following names were received:\n";
    PrintArray(name);
    cout << endl << "The names will now be sorted.\n\n"
        << "Calling Sort Function....\n";
    AlphaSort(name);
    cout << endl << "The sorted name order is now:\n";
    PrintArray(name);

    return 0;
}

void GetInput(char name[][50])
{
    int i;

    for(i=0; i<4; i++)
        cin.getline(name[i], 50);
}

void PrintArray(char name[][50])
{
    int i;

    for(i=0; i<4; i++)
        cout << name[i] << endl;
}

void AlphaSort(char name[][50]) //I'm pretty sure the problem is in here.
{
    int Nnames = 4, pass, column, row, letter, sorted;
    char temp[50];

    cout << "Sorting Function Successfully Called...\n"
        << endl << "Names recieved by sort function:\n";

    PrintArray(name);

    //Specifically in this attempt at a bubble sort.
    for(pass=0; pass<(Nnames-1); pass++)
    {
        for(row=0; row<(Nnames-pass-1); row++)
        {
            for(column=0, sorted=0; sorted==0; column++)
            {
                if(name[row][column]>name[row+1][column])
                {
                    for(letter=0; letter<50; letter++)
                        temp[letter] = name[row][letter];
                    for(letter=0; letter<50; letter++)
                        name[row][letter]= name[row+1][letter];
                    for(letter=0; letter<50; letter++)
                        name[row+1][letter] = temp[letter];
                    sorted = 1;
                }
                else if (name[row][column] == name[row+1][column]);
            }
        }
    }    

    cout << endl << "Name order post sort:\n";

    PrintArray(name);
}

目前运行它通常看起来像这样。

请输入 4 个名字:Hammy Harry Ashe Aaron

收到以下姓名:Hammy Harry Ashe Aaron

现在将对名称进行排序。

调用排序函数....排序函数调用成功...

排序函数收到的名字:Hammy Harry Ashe Aaron

姓名排序后排序:Aaron Ashe Harry Hammy

排序后的姓名顺序现在是:Aaron Ashe Harry Hammy

我一直在寻找类似的问题,但我不知道为什么它很愚蠢。

【问题讨论】:

  • 有人问这里的 sorted 是什么:for(column=0, sorted=0; sorted==0; column++) 我不知道如何让它按字母顺序排在第一个字符之后需要,所以我试过了。所以理论上,它会循环直到它决定名称是有序的,或者更确切地说,它循环直到它找到不再相等的字母。这是针对像 Harry 和 Hammy 这样不会在表面上排序的名字。
  • 再写两个函数(假设你不能使用标准库函数)。一种是比较两个字符串,以确定它们的相对顺序,另一种是交换两个字符串。确保它们正常工作,您的冒泡排序功能将更容易调试。
  • 我会把你的字符串比较函数分离成它自己的函数。然后,在您的函数中,您可以只得到“这是更大还是更小”的结果,而不必担心排序代码中实际的“更大或更小”问题,这可能是令人困惑的事情。但是,我相信有人会在一秒钟内指出您的确切错误。 :D

标签: c++ arrays multidimensional-array bubble-sort alphabetical


【解决方案1】:

似乎我的问题在于我的 if 语句没有解决它已经处于正确顺序的可能性,这使它循环,直到它后来找到一个它想要切换的字母。固定代码如下所示:

void AlphaSort(char name[][50])
{
     int Nnames = 4, pass, column, row, letter, sorted;
     char temp[50];

     cout << "Sorting Function Successfully Called...\n"
          << endl << "Names recieved by sort function:\n";

     PrintArray(name);

     for(pass=0; pass<(Nnames-1); pass++)
     {
                 for(row=0; row<(Nnames-pass-1); row++)
                 {
                            for(column=0, sorted=0; sorted==0; column++)
                            {
                                          if(name[row][column]>name[row+1][column])
                                          {
                                                                     for(letter=0; letter<50; letter++)
                                                                              temp[letter] = name[row][letter];
                                                                     for(letter=0; letter<50; letter++)
                                                                              name[row][letter]= name[row+1][letter];
                                                                     for(letter=0; letter<50; letter++)
                                                                              name[row+1][letter] = temp[letter];
                                                                     sorted = 1;
                                          }
                                          else if (name[row][column]<name[row+1][column])//This is the fix.
                                               sorted = 1;
                            }
                 }
     }    

     cout << endl << "Name order post sort:\n";

     PrintArray(name);
}

【讨论】:

    猜你喜欢
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 2015-03-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多