2017-10-21 143 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; 
}