我必须按升序对数组中的数字进行排序,我的时间复杂度必须为O(n)。我使用基数排序,但速度不够快。任何想法如何让我的代码更快?这是:
void radix(int *a, int n) {
int i;
int sorted[n];
int number = 1;
int biggestNumber = -1;
for(i = 0; i < n; i++){
if(a[i] > biggestNumber)
biggestNumber = a[i]; }
while (biggestNumber / number > 0){
int bucket[10] = { 0 };
for (i = 0; i < n; i++)
bucket[(a[i] / number) % 10]++;
for (i = 1; i < 10; i++)
bucket[i] += bucket[i - 1];
for (i = n - 1; i >= 0; i--)
sorted[--bucket[(a[i] / number) % 10]] = a[i];
for (i = 0; i < n; i++)
a[i] = sorted[i];
number*= 10; } }
答案 0 :(得分:1)
注释 - 排序似乎仅适用于正数,如果[i]为负数,则负数索引用于存储桶[...]并排序[...]。如果不需要有符号整数,则可以更改此选项以对无符号整数进行排序。没有检查数字溢出* = 10.已从堆栈中分配已排序,如果n很大则无法工作。使用malloc()为已排序的空间分配空间。
使排序更快:
将基数的基数从10改为256.为避免可能的溢出,检查0 ==(数字* = 256)以摆脱循环。
在每次通过时替换基数排序的方向。第一次传递从排序到下一次传递从排序到a。这是最简单的使用一对指针,在每次传递时交换,然后在排序完成后,检查排序的数据是否以[]结束,如果不是,则从sorted []复制到[]。< / p>
将存储桶设为矩阵。假设int是32位,而base是256,那么bucket将是[4] [256]。这允许在[]上单次传递以创建桶矩阵。如果int是64位,则桶为[8] [256]。