前言
真的,看到挺多部落格的插入排序,思路大多都是對的,但是在程式碼實現上不嚴謹,甚至還有的跟氣泡排序搞混了,還是有必要分析波插入排序,希望能幫助到大家。
一.插入排序原理
插入排序原理是:逐步構建有序的序列,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。
二.圖解
三.實現思路
插入排序分為3種情況:
1.當前節點<前面的A節點時,A節點後移一位,接著向前繼續比較。
2.當前節點>前面的A節點時,當前節點插入到A節點的後一個位置,此時不需要再繼續比較了,因為A節點及之前的元素已經是有序的了
3.當前節點<前面的A節點時,並且A節點的位置是0時,需要連續兩步操作:A節點往後移一位,當前節點插入到陣列下標為0的位置。
如果這個思路看不懂沒關係,請看程式碼,有更詳細的解釋。
四.程式碼實現
語言採用Java來實現,如果看不懂java程式碼關係也不大,基本每行都有解釋
/** * 實現思路: * 插入排序需要考慮3種情況: * 1.當前節點<前面的A節點時,A節點後移一位,接著繼續比較 * 2.當前節點>前面的A節點時,當前節點插入到A節點的後一個位置,此時不需要再繼續比較了,因為A節點及之前的元素已經是有序的了 * 3.當前節點<前面的A節點時,並且A節點的位置是0時,需要連續兩步操作:A節點往後移一位,當前節點插入到陣列下標為0的位置 * */ public static int[] InsertionSortByFor(int[] arr) { /** * 最多遍歷arr.length-1輪,i的值表示每輪從哪個位置開始向前比較; * 比如arr[1],那麼arr[1]就和arr[0]進行比較 * arr[2],從arr[2]向前掃描比較 * arr[3],從arr[3]向前掃描比較 * 依次類推 */ for(int i=1;i<arr.length;i++) { int temp = arr[i]; //temp是儲存著每輪當前節點的值,儲存的目的是用於與前面的值做比較 for(int j=i-1;j>=0;j--) { //j的值記錄的是當前節點的前面元素的下標位置; //只要滿足j>=0,元素的比較才能進行,若j<0就會超出陣列下標的範圍 //j--才能比較前面的元素 if(temp<=arr[j]) { //當前節點<前面的A元素,那麼A元素往後移 arr[j+1] = arr[j]; if(j==0) { //這裡屬於特殊情況,當temp<=arr[j]以及j==0時,需要連續兩步操作:1.A元素往後移 2.當前節點插入到arr[0]的位置 arr[j] = temp; } }else{ //當前節點>前面的A元素,那當前節點插入到A元素的後面,即j+1的位置 arr[j+1] = temp; break; //break是到這一步就不需要再往前比較了,因為A元素及之前的元素已經是有序了 } } } return arr; }
main方法測試:
public static void main(String[] args) { //建立一個無序陣列 int[] arr = new int[] {3,6,1,87,90,34,34,25}; //呼叫插入排序方法,返回一個排序後的陣列 int[] sortedArr = InsertionSortByFor(arr); //遍歷陣列 for(int i=0;i<sortedArr.length;i++) { System.out.print(sortedArr[i]+" "); } }
測試結果:
其實說得挺詳細的了,基本都有註釋,如果有不懂歡迎大家下面留言,上面的程式碼其實還有優化的空間,只不過臨時寫的,一些細節可能處理不到位請見諒
可以的話給個推薦,讓我知道你來過!