1. 程式人生 > >直接插入排序(Straight Insertion Sort)- java實現

直接插入排序(Straight Insertion Sort)- java實現

學習自嚴蔚敏、吳偉民的《資料結構》-清華大學出版

最簡單的排序方法。基本操作是將一個記錄插入到已排序好的有序表中,從而得到一個新的、記錄數增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)。

舉個例子: