插入排序和希爾排序

概述

Java中排序算法是非常重要的一部分,這裏簡單分析下插入排序和希爾排序的實現思路及其代碼實現。

常見排序算法時間複雜度表

排序算法 平均時間複雜度 最差情形 穩定度 額外空間 備註
冒泡排序 O(n^2) O(n^2) 穩定 O(1) n小時較好
插入排序 O(n^2) O(n^2) 穩定 O(1) n小時較好
選擇排序 O(n^2) O(n^2) 不穩定 O(1) n小時較好
快速排序 O(nlogn) O(n^2) 不穩定 O(nlogn) n大時較好
希爾排序 O(nlogn) O(n^s)1 < s < 2 不穩定 O(1) n大時較好
歸併排序 O(nlogn) O(nlogn) 穩定 O(1) n大時較好
堆排序 O(nlogn) O(nlogn) 穩定 O(1) n大時較好
基數排序 O(nlogn) OlogrB O(n) O(n) B爲真數(0-9),r爲基數個十白

插入排序

插入排序(insertion Sorting)基本思想:把n個待排序的元素看作成,一個有序表,和一個無序表,
開始時有序表只有一個元素,無序表中有n-1個元素。排序過程中,每次從無序表中取出一個元素,將其與有序表中進行比較,將其插入在有序表中合適的位置。

插入排序圖解

插入排序圖解

插入排序代碼實現

public class InsertSort {
	public static void insertSort(int[] arr) {
		if (arr == null || arr.length) {
			throw new IllegalArgumentException();
		}
		for (int i = 1; i < arr.length; i++) {
			// 定義待插入的數
			int insertValue = arr[i];
			// 定義待插入的位置
			int insertIndex = i - 1;

			// 如果插入的值小於他前一個值說明還沒有找到這樣的位置,並將前一個值,向後移動
			while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
				arr[insertIndex + 1] = arr[insertIndex];
				insertIndex--;
			}
			// 退出循環說明已經找到插入的位置
			arr[insertIndex] = insertValue;
		}
	}
}

簡單插入排序存在的問題

假如我們有一個這樣的數組{2, 3, 4, 5, 1},此時我們需要插入的值爲1,那麼執行的過程爲。

  1. {2, 3, 4, 5, 5}
  2. {2, 3, 4, 4, 5}
  3. {2. 3, 3, 4, 5}
  4. {2, 2, 3, 4, 5}
  5. {1, 2, 3, 4, 5}
    很顯然爲了插入一個1,我們一共移動了4次,這種顯然有點浪費效率了,下面我們使用更加牛皮的排序方法,希爾排序

希爾排序

希爾排序簡單介紹

希爾排序是希爾(Donald Shell)於1959年提出的一種排序算法。希爾排序也是一種插入排序,他是簡單插入排序經過改進之後的一種更高的版本,也稱爲縮小增量排序。

希爾排序基本思想

希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。

希爾排序圖解

希爾排序圖解

希爾排序交換法

public class ShellSort {
	public static void shellSort(int[] arr) {
		if (arr == null || arr.length <= 0) {
			throw new IllegalArgumentException();
		}
		int temp = 0;
		for (int gap = arr.length/2; gap > 0;gap /= 2;) {
			for (int i = gap;i < arr.length;i++) {
				for (int j = i - gap;i >= 0 ; j -= gap) {
					if (arr[j] > arr[j + gap]) {
						temp = arr[j];
						arr[j] = arr[j + gap];
						arr[j + gap] = temp;
					}
				}
			}
		}
	}
}

希爾排序位移法

public class ShellSort {
	public static void shellSort(int[] arr) {
		if (arr == null || arr.length <= 0) {
			throw new IllegalArgumentException();
		}
		for (int gap = arr.length/2; gap > 0;gap /= 2;) {
			for (int i = gap;i < arr.length;i++) {
				int insertValue = arr[i];
				int insertIndex = i;

				while (insertIndex - gap >= 0 && insertValue < arr[insertIndex - gap]) {
					arr[insertIndex] = arr[insertIndex - gap];
					insertIndex  -= gap;
				}
				
				arr[insertIndex] = insertValue;
			}
		}
	}
}

代碼寫完,小弟能力有限,歡迎各路大神指點!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章