Go数据结构与算法-插入排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yang731227/article/details/85061162

title: Go数据结构与算法-插入排序
tags: go,算法


介绍

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

基本思想

在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

算法复杂度

平均时间复杂度 O(n2)

排序过程

数组 [29 10 14 37 14]

[UNSORTED]:  [29 10 14 37 14]
[DEBUG]:  [10 29 14 37 14]	# 10 找到位置
[DEBUG]:  [10 14 29 37 14]	# 14 找到位置
[DEBUG]:  [10 14 29 37 14]	# 37 找到位置
[DEBUG]:  [10 14 14 29 37]	# 14 找到位置
[SORTED]:  [10 14 14 29 37]

使用场景

和冒泡排序类似,直接插入排序也是双层嵌套循环,比较后插入有序区间。不适合大数据量排序。因为其比较次数取决于乱序程度,所以对于小数据量(如 1k 个元素以内)或基本有序的大数据量集合进行插入排序都适合。

演示

package main

import (
	"algorithms"
	"fmt"
)

func main() {
	arr := algorithms.GetArr(5, 20)
	arr = []int{29, 10, 14, 37, 14}
	fmt.Println("[UNSORTED]: ", arr)

	n := len(arr)
	if n <= 1 {
		fmt.Println("[ALREADY SORTED]: ", arr)
		return
	}
	// 遍历所有元素
	for i := 1; i < n; i++ {
		// 向前找位置
		for j := i; j > 0; j-- {
			// 合适位置插入
			if arr[j-1] > arr[j] {
				arr[j-1], arr[j] = arr[j], arr[j-1]
			}
		}
		fmt.Println("[DEBUG]: ", arr)
	}
	fmt.Println("[SORTED]: ", arr)
}

猜你喜欢

转载自blog.csdn.net/yang731227/article/details/85061162