如何按字母顺序排序字符串?

时间:2013-08-31 21:44:09

标签: c++ string sorting alphabetical

我一直在尝试使用这个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;
}

如果我分别进入伯爵,唐,克里斯,比尔和安迪,我明白了:

AndyEarlDonChrisBill

有人可以告诉我我的节目有什么问题吗?

5 个答案:

答案 0 :(得分:5)

你可以使用字符串的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. Kamilo
  6.   
  7. 天使
  8.   
  9. 博斯科
  10.   

输出:

Angel
Bosco
Carlos
Gerardo
Kamilo

答案 1 :(得分:1)

您可以使用排序功能:

Sub Test() 
    Dim lastRow As Long
    With Sheets("Sheet1").Range("A:H")
        .AutoFilter
        .AutoFilter Field:=1, Criteria1:=Array("JTKPV LLC", "Living Inc."), Operator:=xlFilterValues
        lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
        If lastRow > 1 Then
            .Range("A1:H" & lastRow).Copy Sheets("Sheet3").Range("A1")
        End If

        .AutoFilter
        .AutoFilter Field:=9, Criteria1:=Array("US", "UK", "AUS"), Operator:=xlFilterValues
        .AutoFilter Field:=8, Criteria1:=">10.00", Operator:=xlAnd
        ' And few more codes 
    End With
End Sub

答案 2 :(得分:0)

您的代码实现了bubble sort的单次传递。基本上缺少'重复,直到外围没有对数组'进行任何更改。

答案 3 :(得分:0)

当名称已经有序时,代码不会小心。添加以下

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

到if语句。

答案 4 :(得分:0)

您使用了太多不必要的循环。试试这个简单而有效的。当字符串按字母顺序排在后面时,你需要交换。

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;


}