0. 前言java
本系列文章將介紹一些經常使用的排序算法。排序是一個很是常見的應用場景,也是開發崗位面試必問的一道面試題,有人說,若是一個企業招聘開發人員的題目中沒有排序算法題,那說明這個企業不是一個「正規」的企業,哈哈,雖然有點戲謔,可是也從側面證實了排序算法的重要性。面試
本文將介紹的是常見排序算法中的插入排序。算法
4 插入排序數組
4.1 基本思想性能
插入排序分爲兩種,一種是直接插入排序,一種是二分插入排序。優化
首先直接插入排序的基本思想是將序列分爲排序好的部分和待排序部分,將待排序部分中的數據一個個的和前面已經排序好的部分比較(逐個從後到前順序比較)並插入到該部分的合適位置,從而實現有序。而二分插入排序則是對直接插入排序法比較過程的一個優化,即從順序比較變成了二分查找比較。this
4.2 直接插入排序的代碼實現spa
/* *@content 直接插入排序 *@author Calvin *@blog http://blog.csdn.net/seu_calvin/article/details/55653764 *@date 2017/02/18 */ public class Order { private int[] array; public Order(int[] array){ this.array = array; } public void sort() { if(array!=null && array.length>0){ for(int i = 1; i<array.length; i++){ //本輪比較的主角 int temp = array[i]; //和前面的有序部分逐個比較 for(int j = i; j>0 ; j--){ if(temp < array[j-1]){ array[j] = array[j-1]; array[j-1] = temp; } } } } } public void print() { for(int i = 0; i < array.length; i++) System.out.println(array[i]); } public static void main(String[] args) { int[] array = new int[]{3,1,5,9,6,5,0}; Order order = new Order(array); order.sort(); order.print(); } }輸出結果略去。
4.3 二分插入排序的代碼實現.net
/* *@content 二分插入排序 *@author Calvin *@blog http://blog.csdn.net/seu_calvin/article/details/55653764 *@data 2017/02/18 */ public class Order { private int[] array; public Order(int[] array){ this.array = array; } public void sort() { if(array!=null && array.length>0){ for(int i = 1; i<array.length; i++){ //本輪比較的主角 int temp = array[i]; //二分查找到要插入的位置 int position = binarySearch(i-1, temp); //移動有序數列 if(i != position){ //排除不須要移動的狀況 for(int j = i; j > position ; j--){ array[j] = array[j-1]; } //最後在要插入的位置插入temp array[position] = temp; } } } } //參數1爲要比較的最大邊界 private int binarySearch(int maxIndex, int data) { int start = 0; int end = maxIndex; int mid; while(start <= end){ mid = (start+end)/2; if(array[mid] > data){ end = mid - 1; }else{ start = mid + 1; } } return start; } public void print() { for(int i = 0; i < array.length; i++) System.out.println(array[i]); } public static void main(String[] args) { int[] array = new int[]{3,1,5,9,6,5,0}; Order order = new Order(array); order.sort(); order.print(); } }輸出結果略去。
4.4 性能特色code
直接插入排序的時間複雜度爲O(n*n),空間複雜度爲O(1),該排序算法是穩定的,這無需所言。須要注意的是,若是數組自己有序度越高,那麼插入排序的內層循環只須要比較、移動較少次,所以插入排序更適合數列近似有序的狀況,可是因爲其時間複雜度不太好,所以不多被單獨使用。
而二分插入排序相對直接插入排序而言,減小了多餘的比較。可是其時空複雜度穩定性和直接插入排序是同樣的。
插入排序常常和快速排序結合使用,由於(1)快速排序在數據量較小時性能不必定好,(2)加上快排後期某個小區塊內的數據相對有序,因此在快速排序的分區規模達到必定數值好比10時,改用插入排序對該「小區」內的數據進行排序。