泡泡排序矢量

时间:2013-09-16 23:02:39

标签: c++ vector bubble-sort

我正在尝试根据其中一个对象属性对对象进行排序。每个Object都有一个与之关联的整数值。我试图使用bubblesort按降序对数组进行排序,但它似乎没有做任何事情。这是我尝试过的:

void Database::sort (vector<Play*> &vec) {
  for (int i = 0; i < (vec.size() - 1); i++) {
    if (vec.at(i)->getRelevance() < vec.at((i + 1))->getRelevance()) {
      Play *tempObj = new Play(vec.at(i));
      vec.at(i) = vec.at((i +1));
      vec.at((i + 1)) = tempObj;
    }
  }
}

getRelevance()是按对象排序的属性。

1 个答案:

答案 0 :(得分:3)

您的代码存在的一个问题是它只包含一个循环!如果要进行冒泡排序,则需要两个嵌套循环。例如,这可能会起作用:

void Database::sort (vector<Play*> &vec) {
    bool have_swapped = true;
    for (unsigned j = 1; have_swapped && j < vec.size(); ++j) {
        have_swapped = false;
        for (unsigned i = 0; i < vec.size() - j; ++i) {
            if (vec[i]->getRelevance() < vec[i + 1]->getRelevance()) {
                have_swapped = true;
                Play * tempObj = vec[i];  // Just use:
                vec[i] = vec[i + 1];      //    std::swap(vec[i], vec[i + 1]);
                vec[i + 1] = tempObj;     // instead of these three lines.
            }
        }
    }
}

你看到外环?它有两个用途。一,它实际上确保我们正在通过向量进行梳理,同时仍然存在无序元素(在算法教科书中称为反转,我相信)和两个,它让我们无法通过无意义的检查由于之前的内部循环迭代,已经“冒泡”到向量末尾的元素。

但冒泡排序不是一个好算法(除非您确定您的输入数据几乎已经排序,在这种情况下,冒泡排序可能非常有效。)相反,您可以这样做:

std::sort (vec.begin(), vec.end(),
    [](Play * a, Play * b){return b->getRelevance() < a->getRelevance();}
);

这就是它。

一些注意事项:

  • 您必须加入<algorithm>
  • 该函数的第三个参数称为“ lambda ”。 Lambdas基本上是没有名称的函数,你可以在代码中间写入并传递。我建议你阅读它们,因为它们是计算和编程中的一个重要概念(与你使用的语言无关。)
  • 由于您希望项目按相关性的降序排序,并且std::sort默认按升序排序(?),当b的相关性小于a时,lambda将返回true第
  • 使用标准排序算法,除了比手动编码更短更甜,更可能是正确的,这意味着您通常会获得非常好的性能(算法Big-O性能和实现 - 明智的。)泡沫排序肯定会好得多(在一般情况下)。