直接插入排序(Straight Insertion Sort)- java實現
阿新 • • 發佈:2018-12-11
學習自嚴蔚敏、吳偉民的《資料結構》-清華大學出版
最簡單的排序方法。基本操作是將一個記錄插入到已排序好的有序表中,從而得到一個新的、記錄數增1的有序表。
先看程式碼:
public static int[] insertSort(int[] arr) { for (int i = 1; i < arr.length; i++) { // arr[i]需要向前移動 if (arr[i] < arr[i - 1]) { int temp = arr[i]; int j = i - 1; // 比temp(arr[i])大的值向後移動一位 System.out.println(i + "-"+j); for (; j >= 0 && arr[j] > temp; j--) { arr[j + 1] = arr[j]; } // **for迴圈中j--後才判斷,所以需要+1 arr[j + 1] = temp; } } return arr; }
簡單說明(語言組織不是很好):
在最外層迴圈,i的值逐漸遞增,每增加1,就判斷arr[i] < arr[i - 1]
false:說明陣列中下標0~i,值是遞增的,因此不需要交換值,迴圈繼續
true:說明下標i處的值應該插入陣列下標0~(i-1)之間,此時將i處的值賦給中間變數-temp,內層迴圈從j(i-1)處開始向前迴圈,直到j >= 0 && arr[j] > temp為止,結束本次內層迴圈,並將temp的值賦給arr[j + 1],即:arr[j + 1] = temp;
整個排序過程為進行n-1趟插入,即:先將序列中的第一個記錄看成是一個有序的子序列,然後從第2個記錄逐個進行插入,直至整個序列變成按關鍵字非遞減有序序列為止。
從空間來看,只需要一個額外的空間-temp;從時間來看,排序的基本操作為:比較兩個關鍵字的大小和移動記錄,總的來說,直接插入排序的時間複雜度為O(n2)。
舉個例子: