插入排序

介绍

插入排序的工作方式像排序一手扑克牌,开始时,我们的左手为空并且桌子上的牌向下,然后我们我们每次从桌子上拿走一张牌并且插入到正确的位置,我们从右往左将它与手中的牌进行比较
如图:


插入排序扑克

原理

插入排序将数列分为有序和无序两个部分,每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中


简略图

简单的来说,蓝色是手中已经排好序的牌,黑色是盖在桌子上的牌, i 是刚从桌子上拿起的牌准备插入手中,依次右往左将它与手中的牌进行比较

Example of insertion sort

python描述

array = [1, 3, 4, 5, 2, 8, 6, 7]
for i in range(1, len(array)):
   tmp = array[i]
   while i > 0 and array[i-1] > tmp:
       array[i] = array[i-1]
       i -= 1
   array[i] = tmp

java 描述

public class Insertion {
    
    // 实现了Comparable接口的都可以比较
    public static void sort(Comparable[] a){
        int N = a.length;
        for (int i = 1; i < N; i++){
            Comparable temp = a[i];
            while( i > 0 && less(temp, a[i-1])){
                a[i] = a[i-1];
                i--;
            }
            a[i] = temp;
        }
    }
    
    public static void main(String[] args) {
        Integer[] a = {2, 3, 1, 3, 4, 8, 6, 10};
        sort(a);
        assert isSorted(a);
        show(a);
    }
    
    public static boolean less(Comparable V , Comparable W){
        return V.compareTo(W) < 0;
    }
    
    public static void exch(Comparable[] a, int i, int j){
        Comparable temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    
    public static void show(Comparable[] a){
        for (int i = 0; i < a.length; i++){
            System.out.print(a[i] + " ");   
        }
        System.out.println();
    }
    
    // 测试数组元素是否有序
    public static boolean isSorted(Comparable[] a){
        for (int i = 1; i < a.length; i++){
            if(less(a[i], a[i-1])){
                return false;
            }
        }
        return true;
    }
}

选出当前要排序的牌,从右往左比较,如果手中的牌的序号大于0(i > 0)并且手中的牌比当前要插入的牌更大,就把当前的牌像右挪一个位置,最后再把这张牌插入其中

算法分析

(n-1) + (n-2) + ... + 1 = n(n-1)/2 平均来说插入排序算法的时间复杂度为O(n2)

稳定性

插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 插入排序的主要思想就是:每次取得一个列表元素,与已排序好的列表进行比较,然后插入相应的位置,最终获得排序好的列表。...
    4ffde5305e8f阅读 310评论 1 0
  • 使用Python进行数据结构操作比较少见,但为了更深入的理解Python的操作原理,提升自己的算法能力。我决定认真...
    mmmwhy阅读 276评论 0 0
  • 冒泡排序 冒泡排序相对来说是较为简单的一种排序,它的思想就是在每一次循环中比较相邻的两个数,通过交换的方式,将最小...
    陌上疏影凉阅读 597评论 0 3
  • 没有你,现在的感情只是过去感情的硬茧。 如果你任凭机会流逝,渐渐的你的心会变得干枯易碎。 全心全意关怀他人总比自怨...
    糯米被盗阅读 321评论 0 1
  • 您喊,放假几天 我,俩月 . . . 你说,三伏天了吧 我说,嗯,天热 . . . 我喊,今年闰六月 你,不说话
    梦绕蝴蝶阅读 316评论 0 0