2017-10-21 144 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

'I

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