AFAIK计数排序使用以下算法:
// A: input array
// B: output array
// C: counting array
sort(A,B,n,k)
1. for(i:k) C[i]=0;
2. for(i:n) ++C[A[i]];
3. for(i:k) C[i]+=C[i-1];
4. for(i:n-1..0) { B[C[A[i]]-1]=A[i]; --C[A[i]]; }
我删除第 3 步和第 4 步,然后执行以下操作呢?
3. t=0; for(i:k) while(C[A[i]]) { --A[i]; B[t++]=i; }
完整的代码在这里,看起来不错,但我不知道哪个有更好的性能。
问题:
- 我猜这两个版本的复杂性是一样的,是这样吗?
- 在第 3 步和第 4 步中,第一个版本需要迭代 n+k 次,第二个版本只需迭代 n 次。那么第二个性能更好吗?