这是一个非常糟糕的排序算法,仅适用于从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]);
}
答案 0 :(得分:2)
您正在radix sort上显示变体。与bucket sort一起,这些算法是不基于比较进行排序的主要示例,它可以提供比O(n logn)
更好的复杂性。
但请注意,您的实施实际上是O(n + size)
。
答案 1 :(得分:1)
O(n)。更具体地说,它是 O(n + k),其中n
是输入数组中元素的数量,k
是您的案例大小中的输入范围。您只是保留数组中出现的所有元素的计数。然后,您只需按原样阵列中的顺序存储它们的次数。此算法称为计数排序。