以O(n)复杂度排序数组

时间:2012-11-15 17:07:04

标签: algorithm sorting

我在Atrenta的采访中被问到一个有趣的问题。这是为了对一个复杂度为O(n)的数组进行排序,我说这是不可能的,但他坚持认为,即使在采访之后也是如此。

就是这样。

你有一个数组,让我们说:[1,0,1,0,1,1,0],这需要进行排序。在数组中必须做什么(从某种意义上说,没有涉及其他数据结构。

我没有,我认为不可能做任何复杂的O(n)。我能想到的最好的是O(n * log n),我的知识来自维基百科。

如果你知道的话,请把你的想法和方法告诉我。

2 个答案:

答案 0 :(得分:7)

在您的示例中,数组中只有两个不同的值,因此您可以使用计数排序:

zero_count = 0
for value in array:
    if value == 0:
        zero_count += 1
for i in 0 ... zero_count:
    array[i] = 0
for i in zero_count ... array.size:
    array[i] = 1

Radix排序是一系列更普遍适用的O(n)种类。

比较排序平均需要Omega(n * log n)比较,因此无法在最坏情况或平均情况下线性时间运行。

答案 1 :(得分:1)

从两端遍历数组并在需要时交换1和0。在O(n)中运行,但是具有所有if条件( bruteforce like approach.probably not the expected answer );)< BR />

int i = 0 ;
int j = array.size -1 ;
for ( i = 0 ; i < j ; ) {

    if( array[i] == 1) {
        if( array[j] == 0 ) {
            array[j] = 1 ; array[i] = 0 ; //Swap 
            i++; j--; 
            continue;
        }
        //else
            j--;
            continue;

    }
   //else
        if( array[j] == 0 ) {
            i++; 
            continue;
        }

        //else 
            i++ ;
            j--;            
}