我有一个大约200个整数的列表,其值介于1和5之间。
我想学习排序算法并知道在哪里应用每个算法,因为目前我使用冒泡排序,因为我被告知的一切都是一种糟糕的做事方式。
这个整数排序的最快排序算法是什么?
编辑:事实证明,因为我知道数字是1到5然后我可以使用桶排序(?)算法,如果我没有弄错 - 我绝对可以 - 意味着对于每个值的整数1,我把它放在1组中,值2我把它放在2组等中,然后在最后连接组。这似乎是一种简单而有效的方法。然而,由于这是(目前)对我来说是学习练习,我将删除1 - 5限制并尝试实现冒泡排序和合并排序,然后比较两者以查看哪个更快。
感谢您的帮助!
答案 0 :(得分:3)
......我被告知这是一种可怕的做事方式。
首先,不要接受任何你从互联网上的随机身体(甚至是我)听到的任何福音。
在某些条件下冒泡排序罚款,例如数据已经大部分排序,或者项目数量相对较小(例如200)(a) ,或者你没有内置于该语言中的排序功能,并且你的时间紧迫,缺乏性能会惹恼客户,但缺乏功能会让你被解雇: - )
这种对冒泡排序的偏见类似于“只有一个函数退出点”和“无转到”规则。您应该理解背后的原因,以便您知道何时可以安全地忽略规则。
无论如何,关于正确的问题。对于特定情况,一种有效的方法是只计算项目然后输出它们,例如:
dim count[1..5] = {0, 0, 0, 0, 0};
for each item in list:
count[item] = count[item] + 1
for val in 1..5:
for quant in 1..count[val]:
output val
这是一个O(n)时间和O(1)空间解决方案,你不会找到一个更有效的big-O用于广义排序例程 - 只有在这种情况下才有可能因为你有关于数据(限于值1到5)。
如果您想检查所有不同的排序算法,Wikipedia Sorting Algorithm page是一个有用的起点,包括主要算法及其属性。
(a)另外,以下代码(使用冒泡排序的最坏情况数据),在不太强大的IBM T60(2GHz双核)笔记本电脑上运行CygWin时,平均完成0.157秒(5个样本:0.150,0.125,0.192,0.199,0.115)。
我不会用它来分类一百万个项目(每个人都知道泡泡排序很差)但在大多数情况下200应该没问题:
#include <stdio.h>
#define COUNT 200
int main (void) {
int i, swapped, tmp, item[COUNT];
// Set up worst case (reverse order) data.
for (i = 0; i < COUNT; i++)
item[i] = 200 - i;
// Slightly optimised bubble sort.
swapped = 1;
while (swapped) {
swapped = 0;
for (i = 1; i < COUNT; i++) {
if (item[i-1] > item[i]) {
tmp = item[i-1];
item[i-1] = item[i];
item[i] = tmp;
swapped = 1;
}
}
}
// for (i = 0; i < COUNT; i++)
// printf ("%d ", item[i]);
// putchar ('\n');
return 0;
}
答案 1 :(得分:1)
您可能不需要在此处进行排序,因为您只有5个可能的值。 您可以使用5个容器(或存储桶),并在扫描整数列表时将值放在右侧存储桶中。 最后,按顺序将桶连接在一起。
答案 2 :(得分:0)