【问题标题】:Is this a valid form of insertion sort?这是一种有效的插入排序形式吗?
【发布时间】:2018-05-01 11:42:06
【问题描述】:

以下代码是否代表插入排序的有效实现?

use warnings;

@arr = (5, 2, 4, 6, 1, 3);
$size = @arr;
print "\nUnsorted array: @arr\n";

for ( $i = 1; $i < $size; $i++ ) {

    while ( $i > 0 && $arr[$i] < $arr[$i-1] ) {

        ($arr[$i], $arr[$i-1]) = ($arr[$i-1], $arr[$i]);
        $i--;
    }
}

print "Sorted Array:   @arr\n";

【问题讨论】:

    标签: perl sorting insertion-sort


    【解决方案1】:

    是的,但它不必要地重新访问已经排序的元素。固定:

    for my $i (1..#$arr) {
        my $j = $i;
        while ( $j > 0 && $arr[$j] < $arr[$j-1] ) {
            ($arr[$j], $arr[$j-1]) = ($arr[$j-1], $arr[$j]);
            $j--;
        }
    }
    

    我添加了my $j = $i;,并在内部循环中从$i 切换到$j。对 for 循环的更改不是功能更改;它只是更清洁,更快。

    现在,该算法与Wikipedia 中显示的第一个算法相同。

    基本上,将@arr 视为两个数组。前导元素形成排序数组,尾随元素形成要插入的未排序元素数组。 $i 是未排序元素的第一个元素的索引,内部循环将$arr[$i] 插入到正确的位置。

    【讨论】:

    • 太棒了!非常感谢! :D
    【解决方案2】:

    是的。它与on Wikipedia显示的第一个算法相同

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-17
      • 2010-12-23
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      相关资源
      最近更新 更多