-2

我一直在尝试使用这个 c++ 程序按字母顺序对 5 个名称进行排序:

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

int main()
{
char names[5][100];
int x,y,z;

char exchange[100];

cout << "Enter five names...\n";

for(x=1;x<=5;x++)
{
    cout << x << ". ";
    cin >> names[x-1];
}
getch();

for(x=0;x<=5-2;x++)
{
    for(y=0;y<=5-2;y++)
    {
        for(z=0;z<=99;z++)
        {
            if(int(names[y][z])>int(names[y+1][z]))
            {   
                strcpy(exchange,names[y]);
                strcpy(names[y],names[y+1]);
                strcpy(names[y+1],exchange);
                break;
            }
        }   
    }
}   

for(x=0;x<=5-1;x++)
    cout << names[x];

return 0;
}

如果我分别输入 Earl、Don、Chris、Bill 和 Andy,我会得到:

AndyEarlDonChrisBill

有人可以告诉我我的程序有什么问题吗?

4

6 回答 6

9

您可以使用字符串的 std::set 或 std::multiset (如果您允许重复的项目),它会自动对项目进行排序(如果需要,您甚至可以更改排序标准)。

#include <iostream>
#include <set>
#include <algorithm>

void print(const std::string& item)
{
    std::cout << item << std::endl;
}

int main()
{
    std::set<std::string> sortedItems;

    for(int i = 1; i <= 5; ++i)
    {
        std::string name;
        std::cout << i << ". ";
        std::cin >> name;

        sortedItems.insert(name);
    }

    std::for_each(sortedItems.begin(), sortedItems.end(), &print);
    return 0;
}

输入:

  1. 杰拉尔多
  2. 卡洛斯
  3. 卡米洛
  4. 天使
  5. 黄宗泽

输出:

Angel
Bosco
Carlos
Gerardo
Kamilo
于 2013-09-03T01:46:14.483 回答
7

您可以使用排序功能:

vector<string> s;
sort(s.begin(),s.end());
于 2017-05-05T10:49:53.293 回答
1

您使用了太多不必要的循环。试试这个简单而有效的方法。当一个字符串按字母顺序比其他字符串晚时​​,您只需要交换即可。

Input
5
Ashadullah
Shawon
Shakib
Aaaakash
Ideone

Output
Aaaakash
Ashadullah
Ideone
Shakib
Shawon


#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s[200],x[200],ct,dt;
    int i,j,n;
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>s[i];
    }

    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {

            if(s[i]>s[j])
            {

                ct=s[i];
                s[i]=s[j];
                s[j]=ct;

            }

        }

    }
    cout<<"Sorted Name in Dictionary Order"<<endl;
    for(i=0;i<n;i++)
    {
        cout<<s[i]<<endl;
    }
    return 0;


}
于 2016-11-15T20:31:39.907 回答
0

当名称已经按顺序排列时,代码不会注意。添加以下内容

else if(int(names[y][z])<int(names[y+1][z]))
            break;  

到 if 语句。

于 2013-09-03T01:10:12.743 回答
0

您的代码实现了一次冒泡排序。基本上错过了围绕外部的“重复直到对阵列没有更改”循环。

于 2013-08-31T22:35:01.263 回答
0

把它放在这里以防有人需要不同的解决方案。

/* sorting example */
#include <iostream>
using namespace std;

bool isSwap( string str1, string str2, int i)
{
    if(str1[i] > str2[i])
        return true;
    if(str1[i] == str2[i])
        return isSwap(str1,str2,i+1); 
    return false;
}

int main()
{   
    string str[7] = {"you","your","must","mike", "jack", "jesus","god"};
    int strlen = 7;
    string temp;
    int i = 0;
    int j = 0;
    bool changed = false;
    while(i < strlen-1)
    {
        changed = false;
        j = i+1;
        while(j < strlen)
        {
            if(isSwap(str[i],str[j],0))
            {
                temp = str[i];
                str[i] = str[j];
                str[j] = temp;
                changed = true;
            }
            j++;
        }
        if(changed)
            i = 0;
        else
            i++;       
    }
    for(i = 0; i < strlen; i++)
        cout << str[i] << endl;
    return 0;
}
于 2021-12-08T16:47:55.873 回答