高度优化的算法,用于对仅由0 n 1组成的数组进行排序

时间:2012-05-17 14:37:01

标签: algorithm sorting

我需要找到一个高度优化的算法来排序一个只包含0 n 1的数组。

我的解决方案版本是计算编号。零(比如说x)和(比如说y)。完成后,在数组中放置x零,然后输入y 1s。这使它成为O(n)。

任何跑得比这更好的算法???我在面试中被问到这个问题。

6 个答案:

答案 0 :(得分:10)

由于您必须检查每个n输入元素,因此无法改进O(n)

此外,由于你的算法需要O(1)内存,你也无法改进(没有什么比O(1)渐近更好。)

答案 1 :(得分:7)

我们不能比O(n)做得更好,但看起来我们可以一次性完成

low = 0; 
high = arr.length - 1;

while (low < high) {
    while (arr[low] == 0) {
        low ++;
    }
    while (arr[high] == 1) {
        high --;
    }
    if (low < high) {
    //swap arr[low], arr[high]
    }
}

答案 2 :(得分:5)

如果对数组求和,则可以得到1的数,效率稍高,但仍为O(n)。

答案 3 :(得分:3)

你不能比O(N)更有效率,因为每个项目都需要进行检查。

答案 4 :(得分:2)

我们在谈论什么样的“数组”?如果我们计算16位无符号整数中的位,那么已经开发了几个O(1)时间算法:参见Fast Bit Count Routines

这是那里提出的算法之一;他们称之为Nifty Parallel Count:

#define MASK_01010101 (((unsigned int)(-1))/3)
#define MASK_00110011 (((unsigned int)(-1))/5)
#define MASK_00001111 (((unsigned int)(-1))/17)
int bitcount (unsigned int n) {
   n = (n & MASK_01010101) + ((n >> 1) & MASK_01010101);
   n = (n & MASK_00110011) + ((n >> 2) & MASK_00110011);
   n = (n & MASK_00001111) + ((n >> 4) & MASK_00001111);
   return n % 255 ;
}

答案 5 :(得分:0)

这听起来像单棒算盘。 现在我很好奇你的面试官是谁。

http://www.dangermouse.net/esoteric/abacussort.html