为了账号安全,请及时绑定邮箱和手机立即绑定

直接插入排序

标签:
深度学习

直接插入排序


title: 直接插入排序
tags: 数据结构与算法之美
author: 辰砂


1.排序过程

名词解释:整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序

例(13,6,3,31,9,27,5,11)

【13】, 6, 3, 31, 9, 27, 5, 11

【6, 13】, 3, 31, 9, 27, 5, 11

【3, 6, 13】, 31, 9, 27, 5, 11

【3, 6, 13,31】, 9, 27, 5, 11

【3, 6, 9, 13,31】, 27, 5, 11

【3, 6, 9, 13,27, 31】, 5, 11

【3, 5, 6, 9, 13,27, 31】, 11

【3, 5, 6, 9, 11,13,27, 31】

2.基本步骤

1.在R[1..i-1]中查找R[i]的插入位置,
R[1..j].key R[i].key< R[j+1..i-1].key;

2.将R[j+1..i-1]中的所有记录均后移一个位置;

3.将R[i] 插入到R[j+1]的位置上。

5be9a46e000114d312960762.jpg

3.算法分析

假设对象个数为n,则执行n-1趟,比较次数和移动次数与初始排列有关

最好情况下:每趟只需比较 1 次,不移动 。总比较次数为 n-1

最坏情况下:第 i 趟比较i次,移动i+1次

5be9a46f000192d513040490.jpg

若出现各种可能排列的概率相同,则可取最好情况和最坏情况的平均情况

平均情况比较次数和移动次数为n2/4时间复杂度为 o(n2)
空间复杂度为 o(1)
是一种稳定的排序方法

4.完整代码示例

/**
 * @description: 插入排序
 *
 * 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。
 * 它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
 *
 * 1 算法描述
 * 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
 *
 * 从第一个元素开始,该元素可以认为已经被排序;
 * 取出下一个元素,在已经排序的元素序列中从后向前扫描;
 * 如果该元素(已排序)大于新元素,将该元素移到下一位置;
 * 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
 * 将新元素插入到该位置后;
 * 重复步骤2~5。
 **/public class InsertionSort {    public static void main(String[] args) {

    }    public static void insertionSort(int [] arr){        int len = arr.length;        int preIndex, current;        for (int i = 1; i < len; i++) {
            preIndex = i - 1;
            current = arr[i];            while (preIndex >= 0 && arr[preIndex] > current) {
                arr[preIndex + 1] = arr[preIndex];
                preIndex--;
            }
            arr[preIndex + 1] = current;
        }
    }
}

原文出处:https://www.cnblogs.com/tojian/p/9935072.html  

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消