美文网首页
Java——直接插入排序

Java——直接插入排序

作者: 牧歌_东 | 来源:发表于2019-01-05 17:29 被阅读0次

直接插入排序是一种最简单的排序算法,在后续我会继续发布其他的简单排序;直接插入的算法基本思想是:仅有一个元素的序列总是有序的,因此,对n个记录的序列,可从第二个元素开始直接到第n个元素,逐个向有序序列中执行插入操作,从而得到n个元素按关键字有序的序列。一般来说,在含有j-1个元素的有序序列中插入一个元素的方法是:从第j-1个元素开始依次向前搜索应当插入的位置,并且在搜索插入位置的同时可以后移元素,这样当找到适当的位置时,即可插入元素。

或许上面的讲解比较官方一点,说的通俗一点,给你一个无序的数组,或者一段需要排序的序列,我们通常用第一个元素作为参考值,从第二个元素开始和这个参考值进行比较,比这个参考值大的时候放在这个参考值的后面,比这个参考值小的时候在和这个参考值的前一位进行比较,当比较至适当位置进行插入。下面是我偷来的一张图:
偷来的图.png

下面是书上给的一个直接插入的算法例子:

输入:数组元素数组r,数组r的待排序区间[low,high]
输出:数组r以关键字有序
public void insertSort(Object[] r,int low,int high){
  for(int i = low +1;i<=high;i++){ //小于时,需要将r[i]插入有序列表
    if(r[i] < r[i-1]){
      Object temp = r[i];
      r[i]  = r[i-1];
      int j=i-2;
      for(;j>=low&&temp < r[j];j++){
      r[j+1] = r[j];//记录后移
      }
      r[j+1] = temp;//插入到正确位置
    }
  }
}

这是书上的算法,但是个人感觉看起来比较生涩,所以自己写了一个例子,进行对比,

public class ZhijieCharuPaixu {
    public static void main(String[] s) {
        int[] a = {1,2,3,0};
        insertSort(a,0,a.length);
         for(int n : a){
                System.out.print(n+" ");
            }
    }
    /**直接插入排序**/
    public static void insertSort(int[] object,int low,int high) {
        //将第一个值看做一个有序序列
        for(int i = 1;i<high;i++) {
            if(object[i] < object[i-1]) {
                int temp = object[i];//待比较的数值
                int j = i-1;
                for(;j >=low&&object[j] > temp;j--) {
                    object[j+1] = object[j];
                }
                //比较完成后获得j最后的位置
                object[j+1] = temp;
            }
        }
    }
}

和书上的进行对比,感觉,i-1位置的数值不用赋值给i位置

现在对我写的这个例子进行分析:

前三个位置的数字是从小到大一次进行排序的,在if(object[i] < object[i-1]条件下不会进行排序,直接对最后位置的0和前面的数值进行比较,直观来看,排序之后应该是0,1,2,3这样一个顺序。进入循环后第一次循环:


1.png 2.png 3.png QQ图片20190105164707.png

这是通过断点,进行的分析,最后一次的插入的位置正是第一个位置(可以自己换成其他的数据进行检验)

空间效率:仅使用一个辅助单元

时间效率:假设待排序的元素个数为n,则向有序表中逐个插入记录的操作进行了n-1趟,每趟操作分为比较关键代码和移动记录,而比较的次数和移动的次数取决于待排序列关键代码的初始排列

  • 最好的情况下,即待排序序列按关键字已经有序排列,每趟操作只需1次或者0次移动
  • 在最坏的情况下,即待排序序列按关键字逆排序序列,这时在第j趟操作中,为插入元素需要同前面的j个元素进行j次关键字比较,移动元素的次数为j+1次。此时有:总比较次数=n(n-1)/2次,总移动次数 = (n+2)(n-1)/2次
  • 平均情况下:即在第j趟操作中,插入记录大约需要时间同前面的j/2个元素进行关键字比较,移动记录次数j/2+1次
  • 直接插入排序的时间复杂度:O(n2)

相关文章

  • 直接插入排序(java)

    扑克牌是我们几乎每个人都可能玩过的游戏。最基本的扑克玩法都是一边摸牌,一边理牌。假如我们拿到了这样一手牌,如图9-...

  • 直接插入排序(JAVA)

    前言   本文集将用java语言实现包括插入排序(直接插入、折半插入、希尔排序),交换排序(快速排序和冒泡排序),...

  • 直接插入排序:(java)

    将一个记录插入到已经排序好的有序表中,从而得到一个新的有序表。可先将第一个数字作为初始的有序表,再将剩余的数次插入...

  • Java——直接插入排序

    直接插入排序是一种最简单的排序算法,在后续我会继续发布其他的简单排序;直接插入的算法基本思想是:仅有一个元素的序列...

  • Java 直接插入排序

    经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中。 将第一个数和第二个数排序,然后构成一个有序序列 将...

  • 直接插入排序-Java

    概念: 直接插入排序是将一条记录插入到已排好序的有序列表中,从而得到一个新的、记录数量增1的有序列表 算法步骤: ...

  • java快速学习排序---插入排序

    1.java实现插入排序 (1)、图解插入排序 (2)、插入排序的思想 (3)、插入排序的代码实现

  • 熟记代码片段

    1.转自 一遍记住Java常用的八种排序算法与代码实现 直接插入排序:

  • 插入排序

    一、直接插入排序 二、折半插入排序

  • 【数据结构】【C#】013-插入类排序:🥇直接插入排序(稳定)

    插入排序:直接插入排序(稳定) 【 算法思想 】 直接插入排序是一种最基本的插入排序方法,其基本操作是将第 i 个...

网友评论

      本文标题:Java——直接插入排序

      本文链接:https://www.haomeiwen.com/subject/uitdrqtx.html