经典排序之插入排序

插入排序(Insertion Sort)的基本思想是:将一个待排序的无序数组分成两部分,通常情况下,将数组首个或者末尾元素视为一个有序数组,将其余部分视为一个无序数组。然后,遍历剩下的n-1个元素,并将其逐个与有序数组部分里的元素做比较,以升序排列为例,将无序数组部分里的元素插入到有序数组部分,并总是确保有序数组部分保持升序排列,直至无序数组中的元素遍历完为止。

我接下来通过代码演示:

 1 import java.util.Arrays;
 2 /**
 3  * 插入排序
 4  */
 5 public class Test1 {
 6     static int k=0;
 7     static void insertSort(int[] arr){
 8         System.out.println("排序前:"+ Arrays.toString(arr));
 9         //将数组分为前后两部分,在将后半部分插入前半部分时,始终确保前半部分处于有序状态
10         for(int i=1;i<arr.length;i++){
11             if(arr[i-1]>arr[i]){
12                 int temp=arr[i];
13                 int j=i;
14                 while(j>0 && arr[j-1]>temp){
15                     arr[j]=arr[j-1];
16                     j--;
17                 }
18                 arr[j]=temp;
19             }else{
20                 continue;
21             }
22             System.out.println("第"+(++k)+"次:"+Arrays.toString(arr));
23         }
24         System.out.println("排序后:"+ Arrays.toString(arr));
25     }
26     public static void main(String[] args) {
27         int[] arr={15,23,8,4,6,9,19};
28         insertSort(arr);
29     }
30 }

  上述代码运行结果如下:

排序前:[15, 23, 8, 4, 6, 9, 19]
第1次:[8, 15, 23, 4, 6, 9, 19]
第2次:[4, 8, 15, 23, 6, 9, 19]
第3次:[4, 6, 8, 15, 23, 9, 19]
第4次:[4, 6, 8, 9, 15, 23, 19]
第5次:[4, 6, 8, 9, 15, 19, 23]
排序后:[4, 6, 8, 9, 15, 19, 23]
  最后,插入排序算法的时间复杂度为O(n²),是稳定的排序算法。
  此外还有一种写法:
package com.itszt.test6;
import java.util.Arrays;
/**
 * 插入排序,数组分为两部分
 * 前一部分始终确保有序
 */
public class Test4 {
    static int k=0;
    public static void main(String[] args) {
        int[] arr={15, 32, 14, 86, 54, 78, 36};
        System.out.println("排序前:"+ Arrays.toString(arr));
        insertSort(arr);
        System.out.println("排序后:"+ Arrays.toString(arr));
    }
    static void insertSort(int[] arr){
        //将待排序数组分为前后两部分,确保前半本部分始终有序
        for(int i=1;i<arr.length;i++){
            int temp=arr[i];
            int j=i;
            while(j>0 && arr[j-1]>temp){
                arr[j]=arr[j-1];
                j--;
            }
            arr[j]=temp;
            System.out.print("第"+(++k)+"次:");
            for(int m=0;m<=i;m++){
                System.out.print(arr[m]+",");
            }
            System.out.println();
        }
    }
}

  上述代码执行如下:

排序前:[15, 32, 14, 86, 54, 78, 36]
第1次排序:15,32,
第2次排序:14,15,32,
第3次排序:14,15,32,86,
第4次排序:14,15,32,54,86,
第5次排序:14,15,32,54,78,86,
第6次排序:14,15,32,36,54,78,86,
排序后:[14, 15, 32, 36, 54, 78, 86]  

【备注:之所以稳定,是指当一个待排序数组中存在两个元素一样的情况时,如数组中有同为6的两个元素,通过插入排序,可以有效确保这两个数的相对前后位置。】

原文地址:https://www.cnblogs.com/lizhangyong/p/8053027.html