【问题标题】:sorting array alphabetically c++按字母顺序排序数组c ++
【发布时间】:2019-05-13 12:42:09
【问题描述】:

编写一个程序以按字母顺序对名称进行排序和显示(使用选择排序)。程序提示用户输入要搜索的名称(使用二进制搜索)。该程序还对名字和姓氏的第一个字符的大写进行了更正。

我只能弄清楚如何使用算法库,但我不允许使用它。

#include <iostream>
#include <string>
#include <string.h>
#include <conio.h>
using namespace std;


int main() {
    const int SIZE = 20;
char temp;
int i, j;
bool madeAswap;
char arr[SIZE][SIZE] = { "Collins, Bill", "Smith, Bart", "Michalski, Joe",
    "Griffin, Jim","Sanchez, Manny", "Rubin, Sarah", "Taylor, Tyrone",
    "Johnson, Jill","Allison, Jeff", "Moreno, Juan", "Wolfe, Bill",
    "Whitman, Jean","Moretti, Bella", "Wu, Hong", "Patel, Renee",
    "Harrison, Rose","Smith, Cathy", "Conroy, Pat", "Kelly, Sean", "Holland, Beth" };
do {
    madeAswap = false;
    for (i = 1; i < SIZE; i++)
    {
        for (j = 1; j < SIZE; j++)
        {
            if (strcmp(arr[j - 1], arr[j]) > 0)
            {
                temp = arr[i][i];
                arr[i][i] = arr[i + 1][i + 1];
                arr[i + 1][i + 1] = temp;
                madeAswap = true;
            }
        }
    }
    }while (madeAswap);
for (int j = 0; j < SIZE; j++) {
    cout << arr[j][j] << endl;
}
system("pause");
return 0;

}

【问题讨论】:

  • 1) 使用 std::string。 2) 使用 std::swap。 3)这看起来不像选择排序。看起来更像冒泡排序。 4) 数组索引从 0 开始。
  • 选择排序是 O(N^2) 并且有两个循环。外部循环遍历索引 i。内部循环从 i 迭代到 N 并找到 i 到 N 范围内的最小元素。你取这个元素并与元素 i 交换。见this answer
  • "[我] 不允许使用 [标准库]。"那你连所谓的 I/O 都做不了。
  • 顺便说一句,由于do... while(madeAswap) 循环,您的代码尝试排序两次。这个逻辑是错误的。而且你没有交换字符串。你在交换角色。为什么temp 声明为char?再次,让您的生活更轻松。使用 std::string 和 std::swap
  • 您的问题缺少具体问题。您当前的代码如何出现故障?您具体在寻求什么帮助(假设您没有要求我们为您做作业)?

标签: c++ arrays sorting


【解决方案1】:

首先,这不是任何排序算法,而是接近冒泡排序,一种耗时的算法。您再次以随机方式处理字符而不是字符串。 看看我所做的这个修改,它只会对你的数组进行排序

#include <iostream>
#include <string>
using namespace std;

int main() {
    const int SIZE = 20;
    string temp;
    int i, j;
    string arr[SIZE] = { "Collins, Bill", "Smith, Bart", "Michalski, Joe",
        "Griffin, Jim","Sanchez, Manny", "Rubin, Sarah", "Taylor, Tyrone",
        "Johnson, Jill","Allison, Jeff", "Moreno, Juan", "Wolfe, Bill",
        "Whitman, Jean","Moretti, Bella", "Wu, Hong", "Patel, Renee",
        "Harrison, Rose","Smith, Cathy", "Conroy, Pat", "Kelly, Sean", "Holland, Beth" };
    for (i = 1; i < SIZE; i++)
    {
        for (j = 1; j < SIZE; j++)
        {
            if ( arr[j-1] > arr[j])
            {
               temp = arr[j-1];
               arr[j-1] = arr[j];
               arr[j] = temp;
            }
        }
    }
    for (int j = 0; j < SIZE; j++) {
        cout << arr[j] << endl;
    }
    system("pause");
    return 0;
}

【讨论】:

  • 你说得对,其实我并没有关注这个。很抱歉。
  • 更好。不过,我不会对任何答案进行投票,因为我仍然看不到问题应该问什么(除了“为我做作业”)。
  • 嘿伙计,我并没有要求任何人为我工作。我对数组中的字符串排序如何工作感到困惑。显然,我想了解为什么我不能使用 strcmp(),因为我很困惑,所以我把它做成了一个二维数组。也许您应该花时间向他人解释事情以帮助人们学习和进步,而不是分享您如何推迟投票。那有什么意义呢。如果您无法理解错误,请继续讨论您可以处理的问题。 @JaMiT
  • 这个排序部分只是我整个程序的一小部分。我一直在阅读很多试图理解代码的内容。我不需要你让我气馁。
  • @Brett 这样更好。询问strcmp() 将是一个很好的问题。比简单地展示你的家庭作业并寻求解决方案要好得多。 (看看您写的问题,并尝试找出让您感到困惑的一些迹象。它不存在。)由于这个问题有答案,但编辑这个问题以使其变得更好可能为时已晚。不过,一个新问题是可能的。
【解决方案2】:

您说您需要使用“选择排序”,但您使用的是“冒泡排序”。我在两个循环(for)和字符串交换(move)上修改了你的程序。

#include <iostream>
#include <string>
#include <string.h>
using namespace std;

int main() {
    const int SIZE = 20;
    string temp;
    int i, j;
    string arr[SIZE] = { "Collins, Bill", "Smith, Bart", "Michalski, Joe",
        "Griffin, Jim","Sanchez, Manny", "Rubin, Sarah", "Taylor, Tyrone",
        "Johnson, Jill","Allison, Jeff", "Moreno, Juan", "Wolfe, Bill",
        "Whitman, Jean","Moretti, Bella", "Wu, Hong", "Patel, Renee",
        "Harrison, Rose","Smith, Cathy", "Conroy, Pat", "Kelly, Sean", "Holland, Beth" };
    for (i = 0; i < (SIZE - 1); i++)
    {
        for (j = (i+1); j < SIZE; j++)
        {
            if ( arr[i] > arr[j])
            {
               temp = arr[i];
               arr[i] = arr[j];
               arr[j] = temp;
            }
        }
    }
    for (int j = 0; j < SIZE; j++) {
        cout << arr[j] << endl;
    }
    system("pause");
    return 0;
}

真正的“选择排序”具有比较复杂度 O (n ^ 2) 和移动复杂度 O (n)。我认为正确的实现方式应该是这样的:

#include <iostream>
#include <string>
#include <string.h>
using namespace std;

int main() {
    const int SIZE = 20;
    string temp;
    int i, j;
    string arr[SIZE] = { "Collins, Bill", "Smith, Bart", "Michalski, Joe",
        "Griffin, Jim","Sanchez, Manny", "Rubin, Sarah", "Taylor, Tyrone",
        "Johnson, Jill","Allison, Jeff", "Moreno, Juan", "Wolfe, Bill",
        "Whitman, Jean","Moretti, Bella", "Wu, Hong", "Patel, Renee",
        "Harrison, Rose","Smith, Cathy", "Conroy, Pat", "Kelly, Sean", "Holland, Beth" };
    for (i = 0; i < (SIZE - 1); i++)
    {
        int k = i;
        for (j = (i+1); j < SIZE; j++)
        {
            if ( arr[k] > arr[j])
            {
               k = j;
            }
        }
        if (i != k) {
            temp = arr[i];
            arr[i] = arr[k];
            arr[k] = temp;
        }
    }
    for (int j = 0; j < SIZE; j++) {
        cout << arr[j] << endl;
    }
    system("pause");
    return 0;
}

解释代码:String 是一个包含字符数组的 C++ 类。语句“string arr [SIZE]”是一个大小为 SIZE 的字符串数组。您可以参考'http://www.cplusplus.com/reference/string/string/'处的字符串类。

您的代码中的另一个问题与排序有关。 “选择排序”通过将一个元素与后续元素进行比较来对列表进行排序,所以你的第二个循环是错误的,它应该是:'for (j = (i + 1); j

最后,你只需要在你完成整个j for之后进行交换(移动)。

【讨论】:

  • 非常感谢,所以我可以通过将其写为 arr[i-1] > arr[i] 来比较字符串值?我以为我必须使用 strcmp(),请解释一下它是如何工作的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2017-05-18
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
相关资源
最近更新 更多