我正在尝试更好地理解下面显示的排序算法并且我没有成功,因为我不是来自计算机领域,我不知道这个算法是否在某个已知的算法中。
#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回答了问题:
这种排序算法是一些经典且已知的算法吗?如果是,它的名称是什么,我在哪里可以找到有关它的参考。在这篇参考文献中,如果我能找到一些关于这种算法效率的讨论会很棒。
如果它不是一个经典的排序算法,我想帮助理解它的逻辑,再次知道效率。
答案 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 Sort或Merge Sort。
答案 2 :(得分:0)
排序算法与选择排序非常相似。它具有(相当糟糕的)O(n²)的运行时间。
然而,这个实现甚至比“普通”实现更糟,因为它适用于两个数组:原始数组和排序数组。通常,选择排序是就地(只有一个数组)。这样做的好处是内部循环可以跳过已经排序的数组元素。
此实现的另一个缺点是它不适用于负数。但也许这不是必需的。