插入排序 Insertion sort

插入排序是一個簡單的排序算法,一次排序一項構建最終的有序數組。在大列表排序上相比於更先進的算法例如快速排序、堆排序、歸併排序就不那麼有效了。然而,插入排序有如下優點:

  • 簡單實現:Jon Bentley 展示了一個 3 行代碼的 C 版本和一個 5 行代碼的優化版本。
  • 對小數據集有效,非常像其他平方排序算法。
  • 在實踐中比其他平方算法例如選擇排序、冒泡排序更有效。
  • 自適應:對已經排序的數據集有效:時間複雜度是 O(kn) 當輸入的每一個元素從它排序的位置起不超過 k 個位置。
  • 穩定的:不改變相同元素的相對位置。
  • 在原來位置的:只要求常數數量 O(1) 的額外存儲空間。
  • 在線的:當它接收一個列表的時候就可以排序。

其實,我們打撲克牌時的摸牌階段就很像插入排序。
打撲克牌
下面給幾個插入排序的模板:

模板一:

public void insertionSort(int[] nums) {
	for (int i = 1; i < nums.length; ++i) {
		for (int j = i - 1; j >= 0; --j) {
			if (nums[j] > nums[j + 1]) {
				int tmp = nums[j + 1];
				nums[j + 1] = nums[j];
				nums[j + 1] = tmp;
			}
		}
	}
}

模板二:

public void insertionSort(int[] nums) {
	for (int i = 1; i < nums.length; ++i) {
		int tmp = nums[i];
		int j = i - 1;
		while (j >= 0 && nums[j] > tmp) {
			nums[j + 1] = nums[j];
			--j;
		}
		nums[j + 1] = tmp;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章