插入排序法

Posted 算法精解

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入排序法相关的知识,希望对你有一定的参考价值。

简介

插入排序(Insertion Sort)的算法是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后先前扫描,找到相应位置并插入该数据,使数据形成有序排列。
算法描述
一般的来说,插入排序都在一个数组上进行。具体算法描述如下:
(1)对于第一个元素,因为没有比较,将其作为已经有序的元素;
(2)从数组中获取下一个元素,在已经排序的元素序列中从后向前扫描,并判断该元素与已排序元素的大小。
(3)若排序序列的元素大于新元素,则将该元素移到下一位置。
(4)重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。
(5)将新元素插入到该位置。
(6)重复步骤2~5,直到将数组中的数据处理完。
下面以一组待排序的数据演示插入排序的过程,假设有8个需要排序的数据序列如下:
69, 65, 90, 37, 92, 6, 28, 54
通过插入排序法进行排序的过程如图1所示。

图1 插入排序过程
(1)在原始数据中,将第1个数据作为已排序的数据序列。
(2)取出第2个数据,将其与已排序的数据进行比较,因第2个数据小于第1个数据,将这两个数据进行交换,完成第1次插入排序。
(3)取出第3个数据,将其与已排序的数据(前两个数据)进行比较,因第3个数据大于已排序的两个数据,不需要进行交换。
(4)这样重复操作,最后得到有序的数据序列。
算法实现
插入排序Golang代码
func InsertSort(arr []int) { var j int for i := 1; i < len(arr); i++ { // 取出一个未排序的数据 temp := arr[i] for j = i - 1; j >= 0 && temp < arr[j]; j-- { // 向后移动数据 arr[j + 1] = arr[j] } arr[j + 1] = temp }}
测试用例
func TestInsertSort(t *testing.T) { rand.Seed(time.Now().Unix()) var arr []int for i := 0; i < 10; i++ { temp := rand.Intn(1000) arr = append(arr, temp) } originSort, origin := append([]int{}, arr...), append([]int{}, arr...) sort.Ints(originSort) insertSort.InsertSort(arr) if !reflect.DeepEqual(originSort, arr) { t.Errorf("Got %v for input %v; expected %v", arr, origin, originSort) }}
测试结果如图2所示

图2 测试结果

相关文章:

《零基础学算法第2版》4.6直接插入排序法

以上是关于插入排序法的主要内容,如果未能解决你的问题,请参考以下文章

插入排序法

算法排序----插入排序法

三大基础排序算法(冒泡排序,选择排序,插入排序)

PHP--冒泡选择插入排序法

php 四种基础算法 ---- 插入排序法

重温基础算法内部排序之插入排序法