前言:
昨天下午寫好了冒泡排序后,緊跟其后,今天跟新上插入排序算法。
插入排序:它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從后向前掃描,找到相應位置並插入
情景描述:
緊接冒泡排序,每次同學們都屢試不爽,但是學生越來越多了,老師發現每次排完隊,就耽擱了大半節課時了,說道:“咱不用冒泡了,有點OUT了,今天來插入排序”。這時體育老師擔任起了數學老師的職責,又給同學們講了種排隊方式--插入排序。
- 開始以第一位同學為基准,由第二個同學開始向前和第一位同學比較,個頭高了不動,低了換位
- 第三個同學要先和自己前面的第二位同學比較,如果低了,和第二換位,然后再向前和第一比較,低了再換,否則阻斷,不再比較
- 從前往后依次執行步驟2,依次出來一位同學,每次和自己前面的同學進行比較,找到一個合適位置插入,其余學生后移
合適位置:前一位同學等於或低於自己身高,並且后一位同學高於自己身高
按照這個方式,同學們一個個依次找准位置,再也不用每次相鄰的都比較,而且找到位置后就不必再往前面比較了......
上圖中,深色部分為每次已排完序的列表,紅色指引末端為要插入元素,其余枝節為即將與之一一比較的元素。
代碼片段:
/** * 插入排序,默認第一位已經排好序,從第二位開始依次向前比較,確定自己的位置后插入,即前一位小余或等於當前,且后一位大於當前。 * 插入后,自己新位置后面的元素依次向后移位, 完成一輪插入排序 * @param arr * @return */ public static int[] insertSort(int[] arr) { int len = arr.length; for (int i = 1; i < len; i++) { if (arr[i - 1] > arr[i]) { int k = arr[i]; int j = i; while (j > 0 && arr[j - 1] > k) { arr[j] = arr[j - 1]; j--; } arr[j] = k; } } return arr; }
優點:容易實現,它借助了"逐步擴大成果"的思想,使有序列表的長度逐漸增加。
缺點:穩定性依據元素的值本身而定,且效率不高。
寫作不易,難免有疏漏和錯誤,還請慷慨指正,不錯請推薦
ps:歡迎轉載,轉載請注明出處:http://www.cnblogs.com/liuyitian/p/4054437.html
每天多學一點點 代碼少敲一點點