选择排序的修改。理论上似乎是正确的,但没有给出结果
Modification to Selection Sort. Theoretically seems correct but doesn't give the results
我正在学习 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
这个问题可以用这个输入数组来演示
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
语句将交换 2
和 7
,将数组更改为
2 5 4 7 6
第二个 if
语句不会移动 7
因为 max_pos == start
。结果,6
停留在数组的末尾,这不是您想要的。
我正在学习 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
这个问题可以用这个输入数组来演示
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
语句将交换 2
和 7
,将数组更改为
2 5 4 7 6
第二个 if
语句不会移动 7
因为 max_pos == start
。结果,6
停留在数组的末尾,这不是您想要的。