【问题标题】:Sorting in Linear Time线性时间排序
【发布时间】:2012-11-01 05:48:28
【问题描述】:

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

请评论我写的代码。据我猜测,最糟糕的时间是 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*N 肯定是线性时间
  • 算法的效果还不是很明显。
  • 您可能需要改写部分问题,因为您声明“数组中的值不能重复”,但后来“全部任务是查找数组中是否存在重复值” .是否存在重复项,你不能同时拥有这两者......不过,我认为诀窍可能是意识到[0, N-1] 范围内没有重复项的N 元素数组意味着每个范围内的数字恰好出现一次,因此排序后的结果就是序列0 ... N-1
  • 任务是找到重复的键。所以,考虑到没有重复值,我将对数组进行排序。但是在切换元素之前,我要检查单元格中的值是否已经是正确的值并在这种情况下抛出消息
  • @user1448906 看起来不错。我认为没有更有效的方法来做到这一点。

标签: algorithm sorting


【解决方案1】:

回答原问题:

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

为什么还要排序?排序后的数组已经知道并且是[0..N-1]


考虑到您的额外 1:您的算法看起来不错,您正在查看每个元素一次,并且必须至少查看每个元素一次,所以它不会变得更好。 2*N 也是 O(N)

【讨论】:

  • 不是O(1),但问题仍然存在:为什么还要排序?
  • 我唯一能想到的是一些值可能不存在;即空值。
  • @hvgotcodes ints 不能是 null。如果任何形式的NaNs 可能存在并重复,这仍然是一个好点
  • @hvgotcodes 在这种情况下,OP 代码中的switchElements(a[i], a[a[i]]); 会失败,如果它是一些无效的数字。
  • 如果这是一个 Java 问题,您应该这样标记它。否则这与语言无关。
【解决方案2】:

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

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

【讨论】:

  • 我已经解决了那个任务,并且故意更改了代码,并且没有首先写重复以使您更清楚。问题是是否有可能让它更快;)
  • P.S.根据你的链接 - 答案是否定的。我自己写的,不知道这样的算法已经存在
猜你喜欢
  • 2021-06-14
  • 2013-03-18
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多