【问题标题】:Modification to Selection Sort. Theoretically seems correct but doesn't give the results修改选择排序。理论上似乎是正确的,但没有给出结果
【发布时间】:2016-04-03 10:50:08
【问题描述】:

我正在学习 ruby​​,我正在学习的方法是学习和实现排序算法。在进行选择排序时,我尝试对其进行如下修改:

  • 在每次遍历中,不是找到最小的并将其移动到数组的顶部或开头,而是找到最小的和最大的并将它们移动到两端

  • 对于每次遍历,增加必须循环通过的数组的开始位置并减少结束位置

  • 在交换时,如果确定的最小值和最大值处于相互交换的位置,则交换一次(否则,将进行两次交换,1 次交换最小值,1 次交换最大值)

这似乎不适用于所有情况。我在逻辑中遗漏了什么吗?如果逻辑是正确的,我将重新审视我的实现,但现在我无法弄清楚哪里出了问题。

请帮忙。

更新:这是我进行这种排序的方法的代码:

def mss(array)
  start = 0;
  stop = array.length - 1;
  num_of_pass = 0
  num_of_swap = 0
  while (start <= stop) do
    num_of_pass += 1
    min_val = array[start]
    max_val = array[stop]
    min_pos = start
    max_pos = stop
    (start..stop).each do
      |i|
      if (min_val > array[i])
        min_pos = i
        min_val = array[i]
      end
      if (max_val < array[i])
        max_pos = i
        max_val = array[i]
      end
    end
    if (min_pos > start)
      array[start], array[min_pos] = array[min_pos], array[start]
      num_of_swap += 1
    end
    if ((max_pos < stop) && (max_pos != start))
      array[stop], array[max_pos] = array[max_pos], array[stop]
      num_of_swap += 1
    end
    start += 1
    stop -= 1
  end
  puts "length of array = #{array.length}"
  puts "Number of passes = #{num_of_pass}"
  puts "Number of swaps = #{num_of_swap}"
  return array
end

【问题讨论】:

  • 总体思路应该可行。当开始位置和结束位置放在一起时,您必须小心。任何数量的其他细节都可能有问题。
  • @user3386109 - 我可以在这里发布代码。

标签: algorithm sorting selection-sort


【解决方案1】:

这个问题可以用这个输入数组来演示

7 5 4 2 6

第一次搜索数组后,我们有

start   = 0
stop    = 4
min_pos = 3
min_val = 2
max_pos = 0    note: max_pos == start
max_val = 7

第一个if 语句将交换27,将数组更改为

2 5 4 7 6

第二个if 语句不会移动7,因为max_pos == start。结果,6 停留在数组的末尾,这不是您想要的。

【讨论】:

  • 我知道这些交换出了问题!感谢您指出。
猜你喜欢
  • 1970-01-01
  • 2012-05-12
  • 2022-08-13
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 2021-10-15
  • 2018-02-21
  • 2022-01-16
相关资源
最近更新 更多