按线性时间排序

时间:2012-11-12 19:08:16

标签: algorithm sorting

我需要编写一个对大小为[0..N-1]的数组进行排序的算法,该算法填充了范围[0..N-1]的值。数组中的值不能重复。排序应该在线性时间内工作,我只允许使用一些额外的变量。

plz评论我写的代码。据我猜,最糟糕的时间是2 * N.还是一个线性时间吗?是否有可能更快?

public int sort(){
    int i  = 0;             
    while (i < n){
        if (a[i] != i)      
            switchElements(a[i], a[a[i]]);                  
        else
            i++;                    
    }
    return count;
}

额外1 我真的需要对数组进行排序,因为排序只是任务的一部分。完整的任务是找到数组中的重复值,线性时间,没有其他变量。

2 个答案:

答案 0 :(得分:5)

回答原始问题:

包含非重复元素[0..N-1]的元素[0..N-1]的数组

为什么要排序?已排序的数组已知,并且为[0..N-1]


考虑您的额外1:您的算法看起来很好,您只需查看每个元素一次,并且必须至少查看一次,因此无法改善。此外2*N也是O(N)

答案 1 :(得分:1)

为了检测重复项,您可以进一步扩展该逻辑,强制将值放入各自的位置。

public int sort(){
    int i  = 0;             
    while (i < n){
        while (a[i] != a[a[i]])      
            switchElements(a[i], a[a[i]]);                  
        ++i;                    
    }
    return count;
}

最后,如果任何iiA[i]不匹配则表示重复!
总的来说,它仍然是O(N)程序
有关详细信息,请参阅以下帖子:
Finding duplicates in O(n) time and O(1) space