算法(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.
相关文章推荐
- 排序算法---基础算法(冒泡排序,快速排序,选择排序,直接插入排序,桶排序)
- 算法基础2:插入排序
- 【基础算法】插入排序
- 算法(algorithms)基础之:选择排序
- 基础算法之二 直接插入排序的三种实现
- 基础算法系列(三)——插入排序
- 基础算法——直接插入排序
- 算法与数据结构基础(二)排序基础2.插入排序
- 算法基础之----直接插入排序
- 基础算法学习(一)__几种排序:选择、插入、冒泡和快排
- 基础算法-直接插入排序
- 算法基础-直接插入排序
- 基础算法:插入排序
- 数据结构与算法之基础排序(冒泡/插入/选择)<十>
- c# 排序 算法 函数 冒泡 选择 插入 希尔
- 用JAVA实现排序算法之二:直接插入排序
- 计算机视觉计算理论与算法基础-computer vision algorithms and the theoretical calculation based
- 基础排序算法演示程序
- C#算法----(三)插入排序
- 【数据结构与算法基础】单链表及其应用基数排序 / Singly Linked List and radix sort