C ++冒泡排序动态分配数组

时间:2017-10-21 13:52:21

标签: c++ arrays sorting

我写了一个气泡排序算法,它使用字符串比较对动态分配的数组进行排序。

这是我的代码:

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循环,则不会发生这种情况,但第一个元素从未排序(显然)。

如何正确实施冒泡排序?这似乎是一项微不足道的任务。我错过了什么吗?

3 个答案:

答案 0 :(得分:1)

纯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的功能是指示在完成数组传递后没有发生交换,因此它表示数组现在已经排序。

答案 1 :(得分:1)

您可以在外循环上使用显式绑定。

您还应该将其分解为较小的功能。

StopIteration

答案 2 :(得分:0)

另一种解决方案:

app.get('/api/login', async (req, res) => {
  const data = req.query
  try {
    const foundUserData = await findUser(data.formData)
    if(foundUserData && foundUserData.user) {
      return res.json(foundUserData)
    } else {
      return res.status(400).json({message: 'User not found'});
    }
  } catch (err) {
    return res.status(500).json(err)
  }
})