经典排序之插入排序
插入排序(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的两个元素,通过插入排序,可以有效确保这两个数的相对前后位置。】