插入排序

插入排序

基本思想

插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 [1] 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动

实现步骤

思想1:可将插入排序看作是整理手中的扑克牌,刚开使手中拿着一张牌,之后取到的牌与手中的比较找到合适的位置(大的放后面,小的放前面)

思想2:将n个待排序的数看作是一个有序表和一个无序表,起始有序表中只有一个数,将无序表中的数依次取出有序的插入有序表中

1,将无序表中拿到的数插入有序表时,默认插入的下标为有序表的最后一个位置(index),

2,将待插入数据与有序表的最后一个位置的数进行比较,大于则找到要插入的位置(index+1);

3,否则,待插入数据将插入有序表中间,将有序表的最后一个位置的数进行后移,为待插入腾位置,

4,此时(index--),将待插入数据与有序表的倒数第二个位置的数进行比较,重复(2-3)步骤。

5,若有序表中的所有数据都大于待插入的数据,即当index<0;找到要插入的位置(index+1);

代码实现

public static int[] sort(int[] arr){
    for(int i=1;i<arr.length;i++){
        int index=i-1;//待插入下标
        int insertValue=arr[i];//待插入元素
        while(index>=0 && insertValue<arr[index]){//待插入下标大于等于零;待插入元素小于待插入下标的话,进入循环
            arr[index+1]=arr[index];//让位,将此位置的元素后移,位置让给待插入元素。
            index--;//一轮比较完成后,待插入下标-1继续进行循环比较
        }
        arr[index+1]=insertValue;//由于上面index--,故此时的待插入下标为index+1;
    }
    return arr;
}

复杂度与稳定性

稳定性:若数组中出现重复元素,若排序后重复元素还按照源数组中的先后顺序排列,则称之为稳定,否则为不稳定

in-place:不占用额外内存

n:数据规模

排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 排序方式 稳定性
插入排序 O(n^2) O(n) O(n^2) O(1) In-place 稳定

posted on 2021-05-01 21:42  凡人精灵  阅读(34)  评论(0编辑  收藏  举报

导航