更好地理解排序算法 - 寻找有关它的参考

时间:2017-06-24 11:57:03

标签: algorithm sorting

我正在尝试更好地理解下面显示的排序算法并且我没有成功,因为我不是来自计算机领域,我不知道这个算法是否在某个已知的算法中。

#include <iostream>
#include <cstdlib>
#include <ctime>

int main() {
  int unsorted[100] = {};
  srand (time(NULL));
  for (int i = 0; i < 100; i++) {
    unsorted[i] = rand() % 100;
  }
  int sorted[100] = {};
  for (int i = 0; i < 100; i++) {
    int hi = -1;
    int hiIndex = -1;
    for (int j = 0; j < 100; j++) {
      if (unsorted[j] > hi) {
        hi = unsorted[j];
        hiIndex = j;
      }
    }
    sorted[i] = hi;
    unsorted[hiIndex] = -1;
  }
}

Heres回答了问题:

  • 这种排序算法是一些经典且已知的算法吗?如果是,它的名称是什么,我在哪里可以找到有关它的参考。在这篇参考文献中,如果我能找到一些关于这种算法效率的讨论会很棒。

  • 如果它不是一个经典的排序算法,我想帮助理解它的逻辑,再次知道效率。

3 个答案:

答案 0 :(得分:2)

这不是任何经典算法,而是类似于一种,通常称为选择排序。在内部循环的每次迭代的给定代码示例中,我们在未排序数组中查找最高数字并将其放入已排序数组中的第i个索引中,然后在未排序数组中将此数字设为-1。 例如,考虑给定的数组

未分类:5,7,2,9,6 排序数组:

在外循环的第一次迭代之后:i = 0,hi = 9,hiIndex = 3

未分类:5,7,2,-1,6 排序:9

在外环的第二次迭代之后:i = 1,hi = 7,hiIndex = 1

未分类:5,-1,2,-1,6 排序:9,7

你看,我们继续按列表中的降序排序列表。

该算法的时间复杂度为O(n ^ 2),这不是一种非常有效的数组排序方法。如果数组中有负数,则此算法将失败,例如,上述算法无法对此列表{1,5,-5,7,-9]进行排序,因为-1大于-5且-9

答案 1 :(得分:0)

这似乎是一个相当简单但效率低下的算法,它在输入数组上进行多次传递,并将找到的最大数字移动到另一个数组中。如果您正在寻找排序算法,这是非常低效的并且使用额外的空间。您可能希望查看更有效的内容,例如Quick SortMerge Sort

答案 2 :(得分:0)

排序算法与选择排序非常相似。它具有(相当糟糕的)O(n²)的运行时间。

然而,这个实现甚至比“普通”实现更糟,因为它适用于两个数组:原始数组和排序数组。通常,选择排序是就地(只有一个数组)。这样做的好处是内部循环可以跳过已经排序的数组元素。

此实现的另一个缺点是它不适用于负数。但也许这不是必需的。