七大排序算法之希爾排序

前言

這個排序算法,其實就是一個插入排序的改進,可以作爲知識的擴展來學習,由於平時用的不多,所以先記錄在這裏,以後要用不至於沒有頭緒。

原理

希爾排序在數組中採用跳躍式分組的策略,通過某個增量將數組元素劃分爲若干組,然後分組進行插入排序,隨後逐步縮小增量,繼續按組進行插入排序操作,直至增量爲1

時間複雜度

平均情況:介於n和n*n之間

最壞情況:n*n

最好情況:n

代碼

public class ShellSort {

	// 插入排序的改進
	// 希爾排序在數組中採用跳躍式分組的策略,通過某個增量將數組元素劃分爲若干組,然後分組進行插入排序,
	// 隨後逐步縮小增量,繼續按組進行插入排序操作,直至增量爲1。
	// https://www.cnblogs.com/chengxiao/p/6104371.html

	//時間複雜度  最好 n  最壞 n*n  平均情況,是介於二者之間
	public static void main(String[] args) {
		int[] arr={6,3,8,2,9,1};
		System.out.println("排序前數組爲:");
		for(int num:arr){
			System.out.print(num+" ");
		}
		sort(arr);
		System.out.println();
		System.out.println("排序後的數組爲:");
		for(int num:arr){
			System.out.print(num+" ");
		}
	}

	public static void sort(int[] arr) {
		// 增量gap,並逐步縮小增量
		for (int gap = arr.length / 2; gap > 0; gap /= 2) {
			// 從第gap個元素,逐個對其所在組進行直接插入排序操作
			for (int i = gap; i < arr.length; i++) {
				int j = i;
				while (j - gap >= 0 && arr[j] < arr[j - gap]) {
					// 插入排序採用交換法
					swap(arr, j, j - gap);
					j -= gap;
				}
			}
		}
	}

	public static void sort1(int[] arr) {
		// 增量gap,並逐步縮小增量
		for (int gap = arr.length / 2; gap > 0; gap /= 2) {
			// 從第gap個元素,逐個對其所在組進行直接插入排序操作
			for (int i = gap; i < arr.length; i++) {
				int j = i;
				int temp = arr[j];
				if (arr[j] < arr[j - gap]) {
					while (j - gap >= 0 && temp < arr[j - gap]) {
						// 移動法
						arr[j] = arr[j - gap];
						j -= gap;
					}
					arr[j] = temp;
				}
			}
		}
	}

	public static void swap(int[] arr, int a, int b) {
		arr[a] = arr[a] + arr[b];
		arr[b] = arr[a] - arr[b];
		arr[a] = arr[a] - arr[b];
	}
}

如果還不能理解的話,可以參考下面這篇博客,講的詳實正確,生動形象,重點是有圖哦,0.0

https://www.cnblogs.com/chengxiao/p/6104371.html

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