插入排序详解(Java)

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。

1.算法步骤

  1. 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
  2. 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

 2.动图演示

3.详细步骤 

 第一次排序:

插入排序详解(Java)_第1张图片

 第二次排序:

插入排序详解(Java)_第2张图片

 循环上述步骤,直到循环结束。

4.代码示例

package test;

/**
 * 全都给我写代码
 *
 * @author jiangminghui
 * @date 2022/11/07 22:19
 **/
public class InserSort {
    public static void main(String[] args) {
        int[] ints = insertSort(new int[]{9, 2, 7, 5, 4, 0, 3, 1, 8});
        for (int anInt : ints) {
            System.out.print(anInt+" ");
        }
    }
    static int[] insertSort(int[] arr){
        for (int i = 1; i < arr.length; i++) {
            for (int j = i; j > 0; j--) {
                if(arr[j-1]>arr[j]){
                    swap(arr,j,j-1);
                }
            }
        }
        return arr;
    }
    static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

5.稳定性及时间复杂度

在使用插入排序时,元素从无序部分移动到有序部分时,必须是不相等(大于或小于)时才会移动,相等时不处理,所以直接插入排序是稳定的。

在插入排序中,当待排序序列是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较n- 1次,时间复杂度为O(n)。
  最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+N-1,所以,插入排序最坏情况下的时间复杂度为O(n2)。
  平均来说,array[1…j-1]中的一半元素小于array[j],一半元素大于array[j]。插入排序在平均情况运行时间与最坏情况运行时间一样,是O(n2)。

你可能感兴趣的:(算法与数据结构,算法,排序算法,java)