經典排序算法(5)——希爾排序算法詳解

希爾排序(Shell Sort)是一種典型的插入排序算法,通過對原始序列進行分組進行排序。


一、算法基本思想

(1)基本思想

希爾排序是基於插入排序的以下兩點性質而提出改進方法的: 

  • 插入排序在對幾乎已經排好序的數據操作時, 效率高, 即可以達到線性排序的效率。
  • 但插入排序一般來說是低效的, 因爲插入排序每次只能將數據移動一位
希爾排序的基本思想就是:先將整個待排序的記錄序列分割成爲若干子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄進行依次直接插入排序。

(2)運行過程

希爾排序算法的運作如下:

1、選擇一個增量序列t1,t2,…,tk,其中對於i>j,有ti>tj,tk=1;(增量因子有多種取法,最簡單的是t(i+1) = ti/2)
2、按增量序列個數k,對序列進行k 趟排序; 
3)每趟排序,根據對應的增量ti,將待排序列分割成若干長度爲m 的子序列,分別對各子表進行直接插入排序。僅增量因子爲1 時,整個序列作爲一個表來處理,表長度即爲整個序列的長度。

(3)示例


二、算法實現(核心代碼)

C++實現:

void shell_sort(int arr[], int len) {
	int gap, i, j;
	int temp;
	while (gap < len / 3)
		gap = gap * 3 + 1; 
	for (; gap > 0; gap /= 3)
		for (i = gap; i < len; i++) {
			temp = arr[i];
			for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
				arr[j + gap] = arr[j];
			arr[j + gap] = temp;
		}
}

Java實現:
public void shell_sort(int[] arr) {
	int gap = 1, i, j, len = arr.length;
	int temp;
	while (gap < len / 3)
		gap = gap * 3 + 1;
	for (; gap > 0; gap /= 3)
		for (i = gap; i < len; i++) {
			temp = arr[i];
			for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
				arr[j + gap] = arr[j];
			arr[j + gap] = temp;
		}
}

三、性能(算法時間、空間複雜度、穩定性)分析

希爾排序平均時間複雜度爲O(n(logn)^2);空間複雜度爲O(1);是不穩定的排序算法

發佈了87 篇原創文章 · 獲贊 190 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章