您的位置:首页 > 编程语言 > Go语言

算法(algorithms)基础之:插入排序

2016-11-25 10:54 302 查看

算法(algorithms)基础之:插入排序

转自:算法(algorithms)基础之:插入排序 — 没那么简单的博客

插入排序,对于少量的元素的数据,它是一个有效的算法。它的工作方式就像许多人排序一副扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右往左将它与已在手中的每张牌进行比较,拿在左手上的牌总是排序好的。如图:



假定数组A[5, 2, 4, 6, 1, 3]是需要排序的数据, 长度为6,用php实现如下:

<?php
<?php
/**
* 插入排序[正序]
* author: nsimple
* date: 2016/11/16
* link: http://nsimple.top */
$arr  = [5, 2, 4, 6, 1, 3];
$len  = count($arr);
$step = 0;
for ($i = 1; $i < $len; $i++) {
$key = $arr[$i];
$j   = $i - 1;
while ($j >= 0 && $arr[$j] > $key) {
$arr[$j + 1] = $arr[$j];
$j--;
}
$arr[$j+1] = $key;
process($step, $arr);
}
//记录排序步骤
function process(&$step, $arr = array())
{
echo '<pre>';
$step++;
echo '第' . $step . '步排序:';
print_r($arr);
echo '</pre>';
}


执行结果如下:

第1步排序:Array
(
[0] => 5
[1] => 2
[2] => 4
[3] => 6
[4] => 1
[5] => 3
)
第2步排序:Array
(
[0] => 5
[1] => 4
[2] => 2
[3] => 6
[4] => 1
[5] => 3
)
第3步排序:Array
(
[0] => 6
[1] => 5
[2] => 4
[3] => 2
[4] => 1
[5] => 3
)
第4步排序:Array
(
[0] => 6
[1] => 5
[2] => 4
[3] => 2
[4] => 1
[5] => 3
)
第5步排序:Array
(
[0] => 6
[1] => 5
[2] => 4
[3] => 3
[4] => 2
[5] => 1
)


算法思路:

开始把数组中第2个元素作为参看值A[i], 并依次把后续的元素作为下一次遍历的参考值;

for($i = 1; $i < $len; $i++) {
$key = $arr[$i];
...


2. 从参考值前一个元素A[j]开始,然后先把A[j]与参考值比较,如果大于参考值,则把A[j+1]的值变成A[j], 依次类推,直到找到最后一个比参考值大的元素A[j+1]。其中j依次递减,直到比较完左侧第一个元素;


while ($j >= 0 && $arr[$j] > $key) {
$arr[$j + 1] = $arr[$j];
$j--;
...
}


3. 当第1次参考值比较完之后,需要把参考值插入到最后一个比参考值大的元素A[j+1]的位置上:


$arr[$j + 1] = $key;


这样左侧的元素就依次排好了~

用Go实现如下:

/*
插入排序[正序]
author: nsimple
date:2016年11月17日17:39:29
link: http://nsimple.top */
package main

import (
"fmt"
)

/*追踪排序步骤*/
func showStep(args []int, step *int) {
*step++
fmt.Printf("第%d步排序结果:%v\n", *step, args)
}

/*插入排序[asc正序]*/
func insertSort(args ...int) {
step := 0
p := &step
for i := 1; i < len(args); i++ {
key := args[i]
j := i - 1
for ; j >= 0 && args[j] > key; j-- {
args[j+1] = args[j]
}
args[j+1] = key
showStep(args, p)
}
}

func main() {
arr := []int{5, 2, 4, 6, 1, 3}
insertSort(arr...)
}


执行结果:

D:/Go/bin/go.exe build -i [D:/Go_Workspace/algorithms]
Success: process exited with code 0.
D:/Go_Workspace/algorithms/algorithms.exe  [D:/Go_Workspace/algorithms]
第1步排序结果:[2 5 4 6 1 3]
第2步排序结果:[2 4 5 6 1 3]
第3步排序结果:[2 4 5 6 1 3]
第4步排序结果:[1 2 4 5 6 3]
第5步排序结果:[1 2 3 4 5 6]
Success: process exited with code 0.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息