排序算法-插入排序 InsetSort

插入排序算法的步骤如下:

1、把arr[0]看作有序序列,arr[1]-arr[n]看作无序序列

2、从头到尾扫描arr[1]-arr[n],将扫描到的数据插入有序序列的合适位置中,如果与有序序列中某元素相等则插入该元素后面

总结:第一个元素看为有序表,其他元素看为无序表,将无序逐一插入有序

img

时间复杂度:

平均时间复杂度 O(n^2)

最坏时间复杂度 O(n^2)

最好时间复杂度 O(n)

该算法数据稳定

伪代码

for j=1 to A.length:
    key=A[j]
    //将A[j]插入已排序序列A[1..j-1]
    i=j-1
    while i>0 and A[i]>key
        A[i+1]= A[i]
        i=i-1
    if i+1!=j
    A[i+1]=key

程序:

package Sort;

import java.util.Arrays;

public class InsertSort1 {
    public static void main(String[] args) {
        int[] arr = {10,-1,-3,13,234,35,-9,3};
        System.out.println(Arrays.toString(arr));
        insertSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void insertSort(int[] arr){
        int insertVal = 0;
        int insertIndex =0;
        for (int i = 1; i < arr.length; i++) {
            insertVal = arr[i];  //保存待插入数据
            insertIndex = i-1;   //定位到待插入数据的前一个位置,等待进行比较
            //insertIndex>=0防止数组越界
            //待插入数据小于前一数据,需要继续往前比较,将比较过的数据后移
            while(insertIndex>=0&&insertVal<arr[insertIndex]){
                arr[insertIndex+1]=arr[insertIndex];
                insertIndex--;
            }
            //找到插入位置,但是走出while时-1才不符合条件,故当前位置定位的后一个位置为插入位置,并且如果 插入位置与本身所处位置相同就不用插入,跳过即可
            if(insertIndex+1!=i){
                arr[insertIndex+1]=insertVal;
            }
        }
    }
}
posted @ 2021-04-02 21:10  爱学习的小杨同学  阅读(94)  评论(0)    收藏  举报