Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java常见排序算法详解——直接插入排序

Java常见排序算法详解——直接插入排序

作者头像
Demo_Yang
发布于 2019-04-18 08:17:35
发布于 2019-04-18 08:17:35
43100
代码可运行
举报
文章被收录于专栏:yang0rangeyang0range
运行总次数:0
代码可运行
转载请注明出处:https://cloud.tencent.com/developer/article/1415206
直接插入排序Straight Insertion Sort
概念:

将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录递增1的有序表。

插入排序是进行值移动,而是不值交换。所以在量较小的情况下插入排序性能要优于冒泡和简单选择排序。

原理:

设有一组关键字{K1, K2,…, Kn};排序开始就认为 K1 是一个有序序列;让 K2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列;然后让 K3 插入上述表长为 2 的有序序列,使之成为一个表长为 3 的有序序列;依次类推,最后让 Kn 插入上述表长为 n-1 的有序序列,得一个表长为 n 的有序序列。

具体算法描述如下:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤 2~5

列如我们有一个数组5 7 4 29 10 11共六个,我们按照从小到大排序:

排序过程如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[5]   7   4   29   10   11
  ↑   │
  └───┘
  
[5  7]    4   29   10   11
↑         │
└─────────┘
 
[4   5   7]   29   10   11
          ↑    │
          └────┘
  
[4   5   7   29]   10   11
           ↑        │
           └────────┘
  
[4   5   7   10   29]   11
                ↑        │
                └────────┘
  
[4   5   7   10   11   29]

从中我们可以看到

在最好的情况下,只需进行比较n - 1次,无需进行移动;

在最坏的情况下,比较(n + 2)(n - 1)/2次,交换(n + 4)(n - 1)/2次。

代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  //从小到大排序
    public void insertionSort() {
        for (int i = 1; i < array.length; i++) {
            int key = array[i];
            int j = i - 1;
            while (j >= 0 && array[j] > key) {
                array[j + 1] = array[j];
                j--;
            }
            array[j + 1] = key;
        }

    }

//从大到小排序
    public void insertionSort2() {
        for (int i = 1; i < array.length; i++) {
            int key = array[i];
            int j = i - 1;
            while (j >= 0 && array[j] < key) {
                array[j + 1] = array[j];
                j--;
            }
            array[j + 1] = key;
        }
    }

另一个版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//将arr[i] 插入到arr[0]...arr[i - 1]中
    public static void insertion_sort(int[] arr) {
        for (int i = 1; i < arr.length; i++ ) {
            int temp = arr[i];
            int j = i - 1;  
    //如果将赋值放到下一行的for循环内, 会导致在第10行出现j未声明的错误
            for (; j >= 0 && arr[j] > temp; j-- ) {
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = temp;
        }
    }
算法系列:

冒泡排序

选择排序

二分插入排序

完整代码:

JavaKotlin代码我均放在了GitHub上,欢迎Star!

GitHub地址:https://github.com/yang0range/MyAlgorithm

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.04.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【数据结构】排序算法---直接插入排序(动图演示)
直接插入排序是一种简单直观的排序算法。它的工作原理为将待排列元素划分为「已排序」和「未排序」两部分,每次从「未排序的」元素中选择一个插入到「已排序的」元素中的正确位置。
Crossoads
2024/10/22
5630
【数据结构】排序算法---直接插入排序(动图演示)
【排序算法篇】---直接插入排序
直接插入排序是一种常见而简单的排序算法,其基本思想是将待排序的元素插入到一个已经排好序的有序序列中,从而生成一个新的有序序列。排序的过程可以被视为将待排序的数组分成两个部分:已排序部分和未排序部分。在每一步中,从未排序部分取出一个元素,并将其插入到已排序部分的适当位置,直到所有元素均被插入为止。 具体的实现步骤如下:
意疏
2024/11/25
2400
【排序算法篇】---直接插入排序
八大排序的Java实现概述1. 插入排序—直接插入排序(Straight Insertion Sort)2. 插入排序—希尔排序(Shell`s Sort)4. 选择排序—堆排序(Heap Sort)
概述 排序有内部排序和外部排序 内部排序是数据记录在内存中进行排序 外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存 时间复杂度为最差情况下的复杂度 八大排序就是内部排
JavaEdge
2018/05/16
1.6K0
[数据结构与算法] 排序算法之直接插入排序与希尔排序
插入排序(Insertion Sorting)的基本思想是: 把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
时间静止不是简史
2020/07/25
3650
[数据结构与算法] 排序算法之直接插入排序与希尔排序
八大排序算法总结与java实现
概述 因为健忘,加上对各种排序算法理解不深刻,过段时间面对排序就蒙了。所以决定对我们常见的这几种排序算法进行统一总结。首先罗列一下常见的十大排序算法: 请点击此处输入图片描述 我们讨论的这八大排序算法的实现可以参考我的Github:SortAlgorithms,其中也包括了排序测试模块[Test.java]和排序算法对比模块[Bench.java],大家可以试运行。 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排序算法,他们之间关系如下: 请点击此处输入图片描述 一、直接插入排序(In
企鹅号小编
2018/01/18
1.1K0
八大排序算法总结与java实现
排序之直接插入排序
本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此;一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中都有详细讲解,而我写这些博客只是记录自己学习过程,加入了一些自己的理解,同时也希望给别人提供帮助。
青石路
2018/09/10
9150
排序之直接插入排序
排序算法-插入排序
算法简介 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因为在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 算法描述 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤
武培轩
2018/04/18
6320
排序算法-插入排序
排序三 直接插入排序
本文介绍了插入排序算法,通过一个简单的实例,详细讲解了插入排序的基本原理和实现过程。
静默虚空
2018/01/05
5350
排序三 直接插入排序
那些年,让我面试头大的几个排序算法,今天终于搞懂了!
算法上,最基础的就是排序算法,几乎在面试中,或多或少会要求你手写一些基础算法。今天鱼哥带大家这些基础算法回顾下。
AI科技大本营
2019/05/22
3920
7.2.1 直接插入排序
插入排序是一种简单直观的排序方法,其基本思想在于每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列,直到全部记录插入完成。
week
2018/08/27
5200
常见的7种排序算法
最简单的一种排序算法。假设长度为n的数组arr,要按照从小到大排序。则冒泡排序的具体过程可以描述为:首先从数组的第一个元素开始到数组最后一个元素为止,对数组中相邻的两个元素进行比较,如果位于数组左端的元素大于数组右端的元素,则交换这两个元素在数组中的位置。这样操作后数组最右端的元素即为该数组中所有元素的最大值。接着对该数组除最右端的n-1个元素进行同样的操作,再接着对剩下的n-2个元素做同样的操作,直到整个数组有序排列。算法的时间复杂度为O(n^2)。
全栈程序员站长
2022/09/17
3430
常见的7种排序算法
秒懂排序算法
作者:郭耀华,来自:cnblogs.com/guoyaohua 0、排序算法说明 0.1 排序的定义 对一序列对象根据某个关键字进行排序。 0.2 术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度: 一个算法执行所耗费的时间。 空间复杂度:运行完一个程序所需内存的大小。 0.3
架构师小秘圈
2018/04/02
1K0
秒懂排序算法
十大经典排序算法(动图演示)
不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面。 时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。
mathor
2018/08/03
4.1K0
十大经典排序算法(动图演示)
插入排序—直接插入排序(Straight Insertion Sort)
将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插插入到已入,直至整个序列有序为止。
瑾诺学长
2018/09/21
9460
插入排序—直接插入排序(Straight Insertion Sort)
使用ChatGPT生成了十种排序算法
当前ChatGPT非常火爆,对于程序员来说,ChatGPT可以帮助编写很多有用的代码。比如:在算法的实现上,就可以替我们省很多事。所以,小试牛刀一下,看看ChatGPT生成了排序算法怎么样?
KunkkaWu
2023/04/23
8830
使用ChatGPT生成了十种排序算法
八大排序算法的Java实现(上)
快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短
JavaEdge
2021/02/23
2990
八大排序算法的Java实现(上)
Java实现常见的排序算法
本文简单说下排序算法,比较常见的排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。
Jensen_97
2023/07/20
2830
Java实现常见的排序算法
一文搞定十大排序算法(动画图解)
排序,就是重新排列表中的元素,使表中的元素满足按关键字递增或递减的过程。为了査找方便,通常要求计算机中的表是按关键字有序的。
霍格沃兹测试开发
2022/05/20
2.3K0
JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序
笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。
夜尽天明
2019/07/23
8490
JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序
直接插入排序
算法思想 把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。 设无序数组为a[0…n-1]。 1.初始时,a[0]自成1个有序区,无序区为a[1..n-1]。 2.令i=1,将a[i]插入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。 3.i++并重复第二步直到i==n-1,排序完成。 ---- 一趟直接插入排序方法 具体做法: 将待插入记录 a[i]的关键字从右向左依次与有序区中记录 aj的关键字进行比较: 1.若 a[j]的
qubianzhong
2019/07/01
4450
推荐阅读
相关推荐
【数据结构】排序算法---直接插入排序(动图演示)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档