【问题标题】:Using Insertion Sort return in sorted order the k smallest elements of an array使用插入排序按排序顺序返回数组的 k 个最小元素
【发布时间】:2014-06-26 01:46:43
【问题描述】:

我正在准备软件开发人员的工作面试和复习算法问题。我不知道如何修改插入排序算法,以便它按排序顺序返回大小为 n 的数组的 k 个最小元素。

插入排序算法

for i = 1 to n
  j = i
  while j > 0 and A[j-1] > A[j]
    swap A[j] and A[j-1]
    j = j - 1

在算法末尾添加for循环以获取前k个元素不算数。

【问题讨论】:

  • 是否考虑在外循环中添加中断条件?

标签: algorithm sorting insertion-sort


【解决方案1】:

使用正常的插入排序,您从头到尾循环,每个项目都是 向上移动直到它就位。使用这种插入排序,您仍然可以循环 从头到尾,但如果您所在的项目 >= 第 k 个项目,只需 别管它;如果小于,将其移动到位置k,然后向上移动直到它 到位。

for i = 1 to k
  j = i
  while j > 1 and A[j-1] > A[j]
    swap A[j] and A[j-1]
    j = j - 1

k 个项目现在已排序。

for i = k + 1 to n
  if A[i] < A[k]
    swap A[i] and A[k]
    j = k
    while j > 1 and A[j-1] > A[j]
      swap A[j] and A[j-1]
      j = j - 1

【讨论】:

  • @PhamTrung:这个算法是正确的。您可以根据自己的输入进行尝试。
  • @justhalf 哦,是的,我误解了第二部分,谢谢:)
  • 其实原代码和this有同样的问题:索引从1开始,有时我们会检查A[0]。正在努力...
  • 或者你可以在原始代码中的j = i之后插入if i &gt; k then { swap A[k+1] and A[i]; j = k + 1 }
  • @j_random_hacker:这是一个不错的 hack。不过,似乎它会比我的版本移动更多的数据,不是吗?
【解决方案2】:

另一种选择是对元素 k+1 到 n 有选择地执行内部循环。与之前的解决方案几乎相同,但避免了一些重复代码。

for i = 1 to n
    j = i

    if i < k or A[i] < A[k]
        while j > 0 and A[j-1] > A[j]
            swap A[j] and A[j-1]
            j = j - 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多