O(n)排序算法

时间:2016-09-22 15:30:56

标签: c++ sorting

这是一个非常糟糕的排序算法,仅适用于从0到大小的整数。我不会在大量数据或大数据中使用这样的算法,因为它需要这么多的内存。考虑一下,这个算法在技术上不会在O(n)时间运行吗?

由于

#include <iostream>
#define size 33

int main(){

    int b[size];

    int a[size] = {1,6,32,9,3,7,4,22,5,2,1,0};

    for (int n=0; n<size; n++) b[n] = 0;

    for (int n=0; n<size; n++){
        if (size <= a[n]) throw std::logic_error("error");
        b[a[n]]++;
    }

    int x = 0;
    for (int n=0; n<size; n++){
        for (int t=0; t<b[n]; t++){
            a[x] = n;
            x++;
        }
    }

    for (int n=0; n<size; n++) printf("%d ",a[n]);
}

2 个答案:

答案 0 :(得分:2)

您正在radix sort上显示变体。与bucket sort一起,这些算法是不基于比较进行排序的主要示例,它可以提供比O(n logn)更好的复杂性。

但请注意,您的实施实际上是O(n + size)

答案 1 :(得分:1)

O(n)。更具体地说,它是 O(n + k),其中n是输入数组中元素的数量,k是您的案例大小中的输入范围。您只是保留数组中出现的所有元素的计数。然后,您只需按原样阵列中的顺序存储它们的次数。此算法称为计数排序。