【发布时间】: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