Hoe tekenreeksen alfabetisch sorteren?

Ik heb geprobeerd dit c++-programma te gebruiken om 5 namen alfabetisch te sorteren:

#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;
}

Als ik respectievelijk Earl, Don, Chris, Bill en Andy invoer, krijg ik dit:

AndyEarlDonChrisBill

Kan iemand me alsjeblieft vertellen wat er mis is met mijn programma?


Antwoord 1, autoriteit 100%

Je zou std::set of std::multiset (als je herhaalde items toestaat) van strings kunnen gebruiken, en het zal de items automatisch gesorteerd houden (je zou zelfs de sorteercriteria kunnen veranderen als je wilt).

#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;
}

Invoer:

  1. gerardo
  2. carlos
  3. KAMILO
  4. engel
  5. BOSCO

Uitgang:

Angel
Bosco
Carlos
Gerardo
Kamilo

Antwoord 2, Autoriteit 67%

U kunt de sorteerfunctie gebruiken:

vector<string> s;
sort(s.begin(),s.end());

Antwoord 3, Autoriteit 22%

U gebruikt te veel onnodige lussen. Probeer deze eenvoudige en efficiënte. Je moet gewoon ruilen als een string alfabetisch is dan een andere reeks.

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;
}

Antwoord 4

Uw code implementeert een single-pass van bubble sortive . In wezen ontbreekt de ‘herhaling totdat er geen wijzigingen worden aangebracht in de lus van de array rond de buitenkant.


Antwoord 5

De code is niet voorzichtig wanneer de namen al in orde zijn. Voeg het volgende toe

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

naar de IF-instructie.

Other episodes