Java数据结构与算法——插入排序

声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。

前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本篇文章介绍排序算法中插入排序算法,包括插入排序的思路,适用场景,性能分析,java代码等java

0、其余排序算法索引(待更)

java数据结构与算法——快速排序
java数据结构与算法——桶排序算法

一、插入排序的思想及原理

插入排序通常分为直接插入排序二分插入排序,本文只介绍直接插入排序,二者的区别仅在于插入的方式不同。segmentfault

插入排序是在待排序数组里插入数据。通常咱们认为插入排序就是往一个已经排好序的数列中插入一个元素,使得插入这个数之后,数组仍然有序。数组

下面具体介绍下插入排序的思路:数据结构

  • 首先须要明确待排序的数组由两部分组成,一部分是已经排好序的部分,另外一部分是待排序的部分。
  • 接着咱们每次选取待排序部分的第一个元素,分别与前面排好序的元素进行比较。当大于前面元素时,能够将该元素直接进入已排好序的部分; 当小于前面元素时,须要把这个元素拿出来暂存,将前面的元素后移,继续与前面的元素相比,直到比较到数组第一个元素或者出现第一个小于拿出的这个元素,这时中止比较、移动,直接把这个元素放到当前空位上。
  • 一直重复步骤2,直到待排元素已经没有元素可进行插入时,中止操做,当前数列为已排好序的数列。

二、插入排序java代码实现

首先最外层一定有个大循环,用于待排序部分的数列。还须要一个内层循环,分别与前面排好序的部分进行比较和移动,直到找到位置能够进行插入。参照扑克牌摸牌后排序性能

public class InsertSort {
    private int[] array;
    public InsertSort(int[] array){
        this.array = array;
    }
    
    public void insertSort(){
        if(array==null){
            throw new RuntimeException("没有待排数组");
        }
        int length = array.length;
        if(length>0){
            for(int i=1;i<length;i++){
                int temp = array[i]; //记录未排好序的第一个元素为temp
                int j = i;   
                
                for(;j>0&&array[j-1]>temp;j--){  //原理中的步骤2
                    array[j] = array[j-1];   //移位
                }
                array[j] = temp;   //插入
            }
        }
    }
    
    public void print(){  //用于打印排完序后的数组
        for(int i=0;i<array.length;i++){
            System.out.println(array[i]);
        }
    }
}

测试程序测试

public class SortTest {
    public static void main(String[] args) {
        insertSortTest();
    }

    private static void insertSortTest(){
        int[] array = {3,5,0,7,1,4,6};
        InsertSort is = new InsertSort(array);
        is.insertSort();
        is.print();
    }
}

三、插入排序的特色及性能

插入排序和玩扑克牌摸牌后在手中排序同样的原理,比较容易理解。插入排序在序列近似有序时,效率比较高,由于此时减小了比较和移动的次数。this

从原理和代码来看,插入排序的时间复杂度尾O(n^2),外层循环执行n次,内层在最坏的状况下也执行n次,而且除了比较操做还有移动操做。最好的状况是序列近似有序,这时内层循环只需比较及移动较少个元素便可完成。当序列自己有序时,插入排序的时间复杂度为O(n)。所以,在数列越有序,效率越高。code

空间复杂度为O(1),是常量级的。由于只用了一个变量暂存每次未排好序的首个元素。排序

插入排序是稳定的排序算法,由于是在相对排好序的基础上进行比较和移动,因此能够保持相对顺序不变,因此是稳定的排序算法。

四、插入排序的适用场景

插入排序的特色是在近似有序的状况下效率比较高。但由于其时间复杂度为O(n^2),因此一般并不单独适用。在全部的排序算法中,咱们优先使用快速排序。快速排序在分区规模达到必定的值时(好比10左右),咱们改用插入排序算法排该分区。由于此时的分区内数据每每是近似有序的,因此使用快排并不必定优于插入排序。在不少高级语言在内部对快速排序的实现中,也是在分区达到必定规模改用插入排序来排该分区。

其余排序算法索引(待更)
java数据结构与算法——快速排序
java数据结构与算法——桶排序

码字不易,如对您有帮助,欢迎点赞收藏打赏^_^

相关文章
相关标签/搜索