zoukankan      html  css  js  c++  java
  • 插入排序

    插入排序

    一、算法介绍

    插入排序,一般我们指的是简单插入排序,也可以叫直接插入排序。就是说,每次把一个数插到已经排好序的数列里面形成新的排好序的数列,以此反复。

    插入排序属于插入类排序算法。

    除了我以外,有些人打扑克时习惯从第二张牌开始,和第一张牌比较,第二张牌如果比第一张牌小那么插入到第一张牌前面,这样前两张牌都排好序了,接着从第三张牌开始,将它插入到已排好序的前两张牌里,形成三张排好序的牌,后面第四张牌继续插入到前面已排好序的三张牌里,直至排序完。

    举例说明

    插入排序一个 4 个元素的数列:4 2 9 1

    []表示排好序
    
    第一轮: [4] 2 9 1 拿待排序的第二个数 2,插入到排好序的数列 [4]
    与排好序的数列 [4] 比较
    第一轮进行中:2 比 4 小,插入到 4 前
    第二轮: [2 4] 9 1 拿待排序的第三个数 9,插入到排好序的数列 [2 4]
    与排好序的数列 [2 4] 比较
    第二轮进行中: 9 比 4 大,不变化
    第三轮: [2 4 9] 1 拿待排序的第四个数 1,插入到排好序的数列 [2 4 9]
    与排好序的数列 [2 4 9] 比较
    第三轮进行中: 1 比 9 小,插入到 9 前
    第三轮进行中: 1 比 4 小,插入到 4 前
    第三轮进行中: 1 比 2 小,插入到 2 前
    结果: [1 2 4 9]
    

    二、算法实现

    Go版本
    package main
    
    import "fmt"
    
    func InsertSort(list []int) {
        n := len(list)
        // 进行 N-1 轮迭代
        for i := 1; i <= n-1; i++ {
            deal := list[i] // 待排序的数
            j := i - 1      // 待排序的数左边的第一个数的位置
    
            // 如果第一次比较,比左边的已排好序的第一个数小,那么进入处理
            if deal < list[j] {
                // 一直往左边找,比待排序大的数都往后挪,腾空位给待排序插入
                for ; j >= 0 && deal < list[j]; j-- {
                    list[j+1] = list[j] // 某数后移,给待排序留空位
                }
                list[j+1] = deal // 结束了,待排序的数插入空位
            }
        }
    }
    
    func main() {
        list := []int{5}
        InsertSort(list)
        fmt.Println(list)
    
        list1 := []int{5, 9}
        InsertSort(list1)
        fmt.Println(list1)
    
        list2 := []int{5, 9, 1, 6, 8, 14, 6, 49, 25, 4, 6, 3}
        InsertSort(list2)
        fmt.Println(list2)
    }
    

    输出

    [5]
    [5 9]
    [1 3 4 5 6 6 6 8 9 14 25 49]
    

    Python版本

    def InsertSort(array):
    	for i in range(1, len(array)):
    		if array[i - 1] > array[i]:
    			temp = array[i]     # 当前需要排序的元素
    			index = i           # 用来记录排序元素需要插入的位置
    			while index > 0 and array[index - 1] > temp:
    				array[index] = array[index - 1]     # 把已经排序好的元素后移一位,留下需要插入的位置
    				index -= 1
    			array[index] = temp # 把需要排序的元素,插入到指定位置
    if __name__ == '__main__':
    	array = [5, 9, 1, 6, 8, 14, 6, 49, 25, 4, 6, 3]
    	InsertSort(array)
    

    数组规模 n 较小的大多数情况下,我们可以使用插入排序,它比冒泡排序,选择排序都快,甚至比任何的排序算法都快。

    数列中的有序性越高,插入排序的性能越高,因为待排序数组有序性越高,插入排序比较的次数越少。

    大家都很少使用冒泡、直接选择,直接插入排序算法,因为在有大量元素的无序数列下,这些算法的效率都很低。

  • 相关阅读:
    [12/11/19] 折半&倍增思想学习笔记
    [11/07/19] CDQ学习笔记
    magic cube
    Codeforces Round #514 (Div. 2) B
    Codeforces Round #514 (Div. 2) C. Sequence Transformation
    八位数
    hdu3001Travelling
    Codeforces Round #512 E
    Codeforces Round #512 (Div. 2) D. Vasya and Triangle
    codeforces 1042 e
  • 原文地址:https://www.cnblogs.com/csp813/p/15161881.html
Copyright © 2011-2022 走看看