2017-02-01 5 views
3

アルファベット順に単語のリストを並べ替える方法を理解しようとしています。私が今作成したコードは、各単語が1文字だけの場合にのみ、正しく並べ替えます。もっと手紙に移動すると、それは失敗します。これを解決する手助けができますか?おかげバブルソート2d配列はiostreamのみを使用してアルファベット順にソートされますか?

は私の入力ファイルは、次のとおりです。

Emma 
Liam 
Dill 
Bill 
Kimm 
Jacks 
John 
Hats 
Julia 
Jill 

コード:

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

void sort(char input[10][25], int size); 

int main(){ 
    char input[10][25] = {"Emma", "Liam", "Dill", "Bill", "Kimm", "Jacks", "John", "Hats", "Julia", "Jill"}; 

    sort(input,10); 

    cout << "Sorted:\n"; 
    for(int i = 0; i < 10; i++){ 
     cout << input[i]; 
    } 

    return 0; 
} 


void sort(char input[10][25],int size){ 

    char temp; 
    for(int k = 0;k < 10;k++){ 
     for(int i = 0; i < 9; i++){ 
      for(int j = 0; j < 24; j++){ 
       if(input[i][j] > input[i+1][j]){ 
        temp = input[i][j]; 
        input[i][j] = input[i+1][j]; 
        input[i+1][j] = temp; 
       } 
      } 
     } 
    } 

} 
+1

ヘルパー機能から始めることをおすすめします。 (1)2つの文字列を比較して、辞書的に前に来る文字列を調べる関数。 (2)配列内の2つの文字列をスワップして、正しい順序で配置する機能。 – AffluentOwl

+0

'' John "" Hats "'カンマがないので、初期化されていない 'input [9] '要素を読み込もうとするとUBが後で発生します。 – Raindrop7

答えて

1

コードの主な問題は、1ワードを別のワードにスワップする必要がある場合、配列内の2つのワードを入れ替えないことです。代わりに、最初の単語の文字をスワップします。これは2番目の単語の文字よりも大きくなります。これは混乱した混乱を作ります。例えば

、あなたはあなたの最終結果は、以下の2行

SALLY 
MOMMA 

をスワップしよう:

MALLA 
SOMMY 

もう一つの問題は、「ジョン」と「帽子」の間にカンマが欠落などが、結果としてアレイ内に9つのエントリしかなく、そのうちの1つが「JohnHats」である。

最後に、ソートされた要素を保存するには、バブルソートでループ内の異なるインデックスを使用する必要があります。

ヘルパー関数を使用すると、これをより明確にすることができます。ここでは、最初に書いたものに近いが、ヘルパー関数を使ったソリューションの例を紹介します。

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

bool smaller(char input[10][25], int a_index, int b_index) { 
    char* a = input[a_index]; 
    char* b = input[b_index]; 
    for (int i = 0; a[i] != 0 && b[i] != 0; i++) { 
     cout << a[i] << " " << b[i]; 
     if (a[i] > b[i]) { 
      return false; 
     } else if (a[i] < b[i]){ 
      return true; 
     } 
    } 
    return true; 
} 

void swap(char input[10][25], int a, int b) { 
    for(int i = 0; i < 25; i++){ 
     char temp = input[a][i]; 
     input[a][i] = input[b][i]; 
     input[b][i] = temp; 
    } 
} 

void sort(char input[10][25], int size){ 
    char temp; 
    for(int k = 0; k < 10; k++){ 
     for(int i = k + 1; i < 10; i++){ 
      if (smaller(input, i, k)) { 
       swap(input, i, k); 
      } 
     } 
    } 
} 

int main(){ 
    char input[10][25] = {"Emma", "Liam", "Dill", "Bill", "Kimm", "Jacks", "John", "Hats", "Julia", "Jill"}; 

    sort(input,10); 

    cout << "Sorted:\n"; 
    for(int i = 0; i < 10; i++){ 
     cout << input[i]; 
    } 

    return 0; 
} 
0

まず、あなたのコードでUBを持っている:

string input[10] = { 
     "Emma", "Liam", "Dill", "Bill", "Kimm", 
     "Jacks", "John" "Hats", "Julia", "Jill"}; // a great problem here: 

"John" "Hats":カンマが欠落していることが発生します大災害。

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

void sort(string input[10]); 


int main() 
{ 

    string input[10] = { 
     "Emma", "Liam", "Dill", "Bill", "Kimm", 
     "Jacks", "John", "Hats", "Julia", "Jill"}; 

    sort(&input[0]); 

    for(int i(0); i < 10; i++) 
     cout << input[i] << ", "; 

    cout << endl; 
    return 0; 
} 


void sort(string input[10]) 
{ 

    for(int i = 0; i < 10; i++) 
    { 
     for(int j = i + 1; j < 10; j++) 
     { 
      if(toupper(input[i][0]) > toupper(input[j][0])) // I used `toupper()` to not distinguish between small and capital letters 
      { 
       string temp = input[i]; 
       input[i] = input[j]; 
       input[j] = temp; 
      } 
     } 
    } 
} 
  • の場合:あなたは条件が真の場合、配列とスワップの各単語の最初の文字を比較するだけで済みますので、

    あなたは定数文字列の配列の簡単代わりに、クラスの文字列を使用することができますあなたは2つの言葉の最初の文字を比較することを意味する完全な比較をしたいと思っています。そしてそれらが等しいなら秒を比較して、余分な仕事が必要になります。

0

のは、スワップメソッドを定義してみましょう、コードを読みやすくするために:

void Swap_Names(char a[25], char b[25]) 
{ 
    char c; 
    for (unsigned int i = 0; i < 25; ++i) 
    { 
    c = a[i]; 
    a[i] = b[i]; 
    b[i] = c; 
    } 
} 

比較関数は、コードをより読みやすくすることがあります。

bool Is_Less_Than(char a[25], char b[25]) 
{ 
    bool is_less = false; 
    for (unsigned int 0 = 1; i < 25; ++i) 
    { 
    if (a[i] != b[i]) 
    { 
     is_less = a[i] < b[i]; 
     break; 
    } 
    } 
    return is_less; 
} 

バブルソートは、アイテムを交換することによって動作しますあなたの場合、名前。

void Bubble_Sort(char input[10][25], unsigned int size) // size can't be negative. 
{ 
    bool swap_occurred = true; 
    while (swap_occurred) 
    { 
    swap_occurred = false; 
    for (unsigned int index = 0; index < 9; ++index) 
    { 
     if (! Is_Less_Than(input[index], input[index + 1])) 
     { 
     Swap_Names(input[index], input[index + 1]); 
     swap_occurred = true; 
     } 
    } 
    } 
} 
0

バブルソートは、貧弱なソートアルゴリズムです。

しかし、一時的に保持できる限り、メモリに保持されていないデータを簡単に並べ替えることができるという利点があります。 1回のパスごとに最初の2つのデータ項目がロードされます。次に、下位のものをファイルに保存し、上位のものを保持します。 1つずつロードを続け、低い方を保存します。最後に、より高い値を保存します。

データにランダムアクセスする必要はありませんが、自由に通過できる必要があります。

関連する問題