perl - 这是一种有效的插入排序形式吗?
问题描述
以下代码是否代表插入排序的有效实现?
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";
解决方案
是的,但它不必要地重新访问已经排序的元素。固定的:
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
to切换。$j
对 for 循环的更改不是功能更改;它只是更清洁,更快。
现在,该算法与Wikipedia上显示的第一个算法相同。
基本上,将其@arr
视为两个数组。前导元素构成排序数组,尾随元素构成要插入的未排序元素数组。$i
是未排序元素的第一个元素的索引,内部循环插入$arr[$i]
到正确的位置。
推荐阅读
- json - 如何在 Python 2.7 中有效地解析具有多个键的 JSON 数据?
- selenium - 在 Selenium WebDriver 中获取 java.lang.NullPointerException
- java - 未安装提供程序“gs”
- powershell - 希望通过 csv 文件使用 PowerShell 进行查找和替换
- datagrip - 如何使 IdeaVim 的导航(hjkl 箭头)在 Datagrip 表中工作
- pdf - 如何将用户输入添加到 PDF 文档
- java - Java 所得税计算器需要为任何小于等于 0 的数字添加错误消息
- powerbi - 将分类变量转换为数值 PowerQuery
- r - 错误:意外的 '{' in。使用 if...else 语句
- apache - 为什么没有文件扩展名页面无法加载