2017-10-21 10 views
0

私はまだC++とメモリ管理から始めていますので、私と一緒に裸にしてください!C++バブルソート動的に割り当てられた配列

私は、文字列比較を使って動的に割り当てられた配列をソートするバブルソートアルゴリズムを書いています。ここで

は私のコードです:

void AddressBook::bubble_sort_address_book(){ 
    bool swapped = true; 
    while(swapped){ 
     swapped = false; 
     for(int i = 0; i < noOfEmployees; i++){ 
      if(employees[i].combined_name() > employees[i+1].combined_name()){ 
       Employee temp_employee = employees[i+1]; 
       employees[i+1] = employees[i]; 
       employees[i] = temp_employee; 
      } 
     } 
    } 
} 

私の問題はかなり明白で、まだ私はそれを解決する方法を見つけ出すように見えることはできません。コードは時々(未定義の方法で)行に失敗します。

Employee temp_employee = employees[i+1] 

かなり明白そのiは未定義の動作でi+1結果をメモリにアクセスする、配列の最後に等しい場合ので。しかし、私がnoOfEmployees-1でforループを停止した場合、これは起こりませんが、最初の要素はソートされません(明らかに)。

バブルソートを正しく実装するにはどうすればよいですか?それはそんなに簡単な仕事のようです。何か不足していますか?

ありがとうございます!

+2

'私はnoOfEmployees'は本当に私はnoOfEmployees-1 'を<'でなければなりません<。そして最初の要素がこのようにソートされます。 –

+0

しかし、最初の要素は、少なくとも私のコードでは、この方法でソートされていません。 –

+0

'std :: sort'もあります。これは、使用しているバブルのソートよりも効率的です。 – Rakete1111

答えて

0

純粋なCで、次の簡易版が正常に動作します:

int employees[10]= {3,1,7,6,9,7,1,0,2,6}; 
int noOfEmployees= 10; 

void bubble_sort_address_book(void){ 
    bool swapped = true; 
    int i; 
    while(swapped){ 
     swapped = false; 
     for(i = 0; i < noOfEmployees-1; i++){ 
      if(employees[i] > employees[i+1]){ 
       int temp_employee = employees[i+1]; 
       employees[i+1] = employees[i]; 
       employees[i] = temp_employee; 
       swapped= true; 
      } 
     } 
    } 
} 
int main() 
{ 
    int i; 
    bubble_sort_address_book(); 
    for (i=0; i<noOfEmployees; i++) { 
     printf("emp %d= %d\n", i, employees[i]); 
    } 
    return 0; 
} 

あなたが要求したように、可変swappedの関数は、配列を完全なパスを、次のことは何もスワップが発生していないことを示すためであるので、それは配列を示し、ソートされました。

0

別ソリューション:

#include <iostream> 
#include <vector> 


using namespace std; 

int employees[10] = { 3,1,7,6,9,7,1,0,2,6 }; 


void bubble_sort_address_book(void) { 
    bool swapped = true; 
    int i; 
    int noOfEmployees = 10; 
    while (swapped) { 
     swapped = false; 
     for (i = 1; i <= noOfEmployees ; i++) { 
      if (employees[i] > employees[i - 1]) { 
       int temp_employee = employees[i - 1]; 
       employees[i - 1] = employees[i]; 
       employees[i] = temp_employee; 
       swapped = true; 
      } 
     } 
    } 
} 
int main() 
{ 
    int i; 
    int noOfEmployees = 10; 
    bubble_sort_address_book(); 
    for (i = 0; i<noOfEmployees; i++) { 
     printf("emp %d= %d\n", i, employees[i]); 
    } 
    return 0; 
} 
関連する問題