探析原理思路_直接插入排序(Java)

直接插入排序


前言:在博客写这些文章的目的用于记录所学,怕以后忘了,如果哪里写的不对欢迎指正,谢谢!!

学习目标:掌握直接插入排序算法的原理和思想

一、前提知识

  排序算法概念、时间复杂度。可前往此网址 排序算法学习01_算法基础介绍阅读

二、直接插入排序介绍

  直接插入排序是属于插入排序中的一种简单的排序,它通过抽象两个序列,一个为正在排序的序列称之为有序序列,一个为未排序序列。
  每次从未排序序列中取值放入有序序列,来完成排序,就像抽取扑克牌一样

三、直接插入排序工作原理

  构建一个有序序列,接着取一个未排序序列中第一个元素,然后依次从后往前扫描有序序列中的符合条件的值进行比较,最终找到指定位置插入,成为一个有序序列中的值。然后继续判断未排序序列中的值

在这里插入图片描述

四、直接插入排序设计思路

1.根据工作原理要构建一个有序序列

  • 所说构建,并不是真的再创建一个序列去接收,而是找已排序好的序列范围,然后剩余序列就可以慢慢进去比较。那我们就要先给出一个有序序列,则选择数列的第一位当成一个有序序列

2.未排序序列中的元素,进入有序序列中的过程

  • 我们知道首先要保存待进入元素,然后从后到前扫描,到达目标位置执行插入。但是你要知道我们此时只有一个数组,如何往有序列表a[0] 和 a[1]之中插入元素呢?

  • 假设上面图片,正是我们要排序的数列,要让2插入1和3之间,怎么做?可以这样实现:

    • 每次扫描元素,发现符合条件,则让该有序数列往后移。
    • 比如本来有序数列【排序为递增】为: { 1,3,5 },待插入元素为2,从后往前遍历有序序列,看到元素5时符合条件,那么让元素5往后移,此时元素5将覆盖元素2,也就是在数组中a[3] = a[2]。然后原本a[2]这个位置就可以决定是否插入,进行判断
    在这里插入图片描述

五、直接插入排序算法代码实现

要求对以下这个数列进行递增排序:{3,2,5,1,7,9,8}

package com.migu.sortingAlgorithm;

import java.util.Arrays;

/**
 * 直接插入排序
 */
public class DirectInsertionSort {
    public static void main(String[] args) {
        int a[] = {3,2,5,1,7,9,8};
        // 数列第一位已为有序序列,则从下一位开始判断是否选择插入
        for(int i = 1;i < a.length;i++){
            int insertVal = a[i];  // 保存待插入的值【根据设计思路第一点】
            
            int insertIndex = i-1; // 从有序序列最后一位开始判断,也就是待插入值的前一位索引,该索引往前肯定都是已排序好的【根据设计思路第一点】
            // 由于要求递增,那么就待插入元素小于有序列表中的值时,有序列表值就执行后移动作。然后需要注意数组索引不能越界
            while (insertIndex >=0 && insertVal < a[insertIndex]){ 
                // 【根据设计思路第二点】
                a[insertIndex+1] = a[insertIndex];  // 此举将覆盖待插入的值,但我们已经提前保存了
                insertIndex--;  // 从后往前遍历
            }
           // while循结束inertIndex是还会再--的,所以对其+1。然后保存待插入的值
            a[insertIndex+1] = insertVal;
        }
        System.out.println(Arrays.toString(a)); // 调用工具类输出
    }
}
输出:<img src="E:\哈哈\md\数据结构和算法\zjcr_04.png" alt="zjcr_04" style="zoom: 67%;" />

六、时间复杂度分析

  讨论一个算法的时间复杂度,一般都是看最坏的情况: 简单选择排序算法的时间复杂度为O(n^2)。更多特殊情况请参考其他书籍或博客

七、总结

  直接插入排序算法,不像冒泡排序简单选择排序,每完成一次排序都会在数列某个位置最终确定元素。

  直接插入排序不需要重复走访所有元素,每进行一次排序只在有序序列中走访并对数组上元素进行移动。性能比冒泡排序好比简单选择排序差点
  缺点就是比如要做递增时,待添加元素是在有序序列中最小的,那么就要在数组上移动大量数据,极耗时间。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容