整数列表的排序算法

时间:2012-01-23 21:35:28

标签: sorting

我有一个大约200个整数的列表,其值介于1和5之间。

我想学习排序算法并知道在哪里应用每个算法,因为目前我使用冒泡排序,因为我被告知的一切都是一种糟糕的做事方式。

这个整数排序的最快排序算法是什么?

编辑:事实证明,因为我知道数字是1到5然后我可以使用桶排序(?)算法,如果我没有弄错 - 我绝对可以 - 意味着对于每个值的整数1,我把它放在1组中,值2我把它放在2组等中,然后在最后连接组。这似乎是一种简单而有效的方法。

然而,由于这是(目前)对我来说是学习练习,我将删除1 - 5限制并尝试实现冒泡排序和合并排序,然后比较两者以查看哪个更快。

感谢您的帮助!

3 个答案:

答案 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)

Merge sort是一个O(n log n)我觉得它比QuickSort更好

您可以找到一些C#代码here