1、原理:從整個待排序列中選出一個元素插入到已經有序的子序列中去,得到一個有序的、元素加一的子序列,直到整個序列的待插入元素為0,則整個序列全部有序。
2、思路:
(1)設置監視哨r[0],將待插入的記錄值賦值給r[0];
(2)設置開始查找的位置j;
(3)在數組中搜索,搜索 中將第j個記錄后移,直到r[0].key>=r[j].key為止
(4)將r[0]插入r[j+1]的位置上。
3、舉例
(1)待排序數組:[5,3,4,0,6]
(2)第一趟排序:[5,3,4,0,6]
將r[0]=5設置為監視哨,將1位置上的數3和監視哨5進行比較,3小於5,將5和3交換。
排序結果為:[3,5,4,0,6] 此時0-1范圍上的數值大小已經排好了。
(3)第二趟比較:[3,5,4,0,6]
將4和5進行比較,4比5小,交換位置,排序結果為:[3,4,5,0,6]
將4和3進行比較,4比3大,不交換位置。
排序結果為:[3,4,5,0,6] 此時0-2位置上的數值大小已經排列好了
(4)第三趟比較:[3,4,5,0,6]
將0和5做比較,0比5小,交換位置,排序結果為:[3,4,0,5,6]
將0和4做比較,0比4小,交換位置,排序結果為:[3,0,4,5,6]
將0和3做比較,0比3小,交換位置,排序結果為:[0,3,4,5,6]
排序結果為:[0,3,4,5,6],此時0-3位置上的書已經排好序
(5)第四趟比較:[0,3,4,5,6]
6比5大,已經全局有序 ,不用進行任何的交換
4.java實現的代碼
import java.util.Scanner; public class InsertSort { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請輸入一個數組的大小:"); int a = sc.nextInt(); System.out.println("請輸入一個數組:"); int[] arr = new int[a]; for (int i=0 ; i<a;i++){ arr[i]= sc.nextInt(); } //遍歷數組 for(int k = 0 ; k<arr.length;k++){ System.out.print(" "+arr[k]); } System.out.println(); insertSort(arr); } public static void insertSort(int[] arr){ if(arr==null || arr.length<2){ return; } for(int i=1; i <arr.length;i++){ for(int j=i-1;j>=0&&arr[j]>arr[j+1];j--){ int temp = arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } //將數組進行遍歷 for(int k = 0 ; k<arr.length;k++){ System.out.print(" "+arr[k]); } } }
算法的最大時間復雜度仍然是O(n^2),如果數據有序,那么插入排序的時間復雜度是O(n),如果數據是無序的,比如說是逆序的,那么時間復雜度就是O(n^2)。當數據狀況不同,一律按照最差的時間復雜度進行估計。
時間復雜度為一個算法流程中,常數操作數量的指標,常用O來表示
