经典算法之插入排序(InsertionSort)

在这里插入图片描述

活动地址:CSDN21天学习挑战赛

一、算法介绍

插入排序,也称为直接插入排序。插入排序是简单排序中效率最好的一种,它也是学习其他高级排序的基础,比如希尔排序/快速排序,所以非常重要,而它相对于选择排序的优点就在于比较次数几乎是少了一半。

二、算法思想

每次将待排序的元素插入到已排序的序列中,直至全部插入完成。

三、算法原理

  • 把所有元素分为两个序列,将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

  • 从未排序序列中的第一个元素开始,向已排序的序列中插入

  • 倒序遍历已排序序列,依次和待插入的元素比较,找到一个小于或等于待插入的元素,插入到该元素后面,其余元素向后移动一位

四、动图演示

在这里插入图片描述

五、代码实现

核心代码

public class InsertionSort {
    
    
    //  插入排序
    public static void sort(Comparable[] a){
    
    
       for (int i = 1;i < a.length;i++){
    
    
           for (int j = i;j > 0;j--){
    
    
               //比较索引j处的值与索引j-1处的值,如果j-1索引处的值大,则交换数据,反之,则找到了合适的位置,退出循环
               if (greater(a[j - 1],a[j])){
    
    
                   swap(a,j - 1,j);
               }else{
    
    
                   break;
               }
           }
       }
    }
    //比较 v 是否大于 w
    public static boolean greater(Comparable v,Comparable w){
    
    
        return v.compareTo(w) > 0;
    }
    //数组元素交换位置
    private static void swap(Comparable[] a,int i,int j){
    
    
        Comparable temp;
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

方法调用

public class InsertionSortTest {
    
    
    public static void main(String[] args) {
    
    
        Integer[] arr = {
    
    3,44,38,5,47,15,36,26,27};
        InsertionSort.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}
//排序前:{3,44,38,5,47,15,36,26,27}
//排序后:{3,5,15,26,27,36,38,44,47}

六、算法分析

6.1 时间复杂度

当待排序的 n 个元素是正序排列时,是排序的最佳情况,只需要比较(n-1)次,时间复杂度是O(n);最坏的情况是该序列是反序排列,此时就需要比较n(n-1)/2次,时间复杂度为 O(n²)。

插入排序的平均时间复杂度为 O(n²)

6.2 空间复杂度

插入排序的空间复杂度为常数阶O(1)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_52986315/article/details/126152319
今日推荐