希爾排序

一、希爾排序是插入排序的一種。一趟一增量,用增量來分組,組內執行插入排序。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。

二、過程:如序列 9 8 7 6 5 4 3 2 1
      確定一個增量序列,如 4(length/2) 2 1 ,從大到小使用增量
      使用第一個增量,將序列劃分爲若干個子序列,下標組合爲0-4-8,1-5,2-6,3-7
      依次對子序列使用直接插入排序法;
      使用第二個增量,將序列劃分爲若干個子序列(0-2-4-6-8),(1-3-5-7)
      依次對子序列使用直接插入排序法:
      使用第三個增量1,這時子序列就是元序列(0-1-2-3-4-5-6-7-8),使用直接插入法
      完成排序。
三、時間複雜度:不太確定在O(nlogn)~O(n²)之間
四、空間複雜度:O(1)
五、原址排序
六、穩定性:由於相同的元素可能會被劃分至不同子序列單獨排序,因此穩定性是無法保證的——不穩定。

import java.util.Arrays;
public class ShellSort {
	public static void main(String[] args) {
		int []arr= {9,8,7,6,5,4,3,2,1};
		System.out.println("原數組:"+Arrays.toString(arr));
		shellSort(arr);
		System.out.println("排序後:"+Arrays.toString(arr));
	}
	public static void shellSort(int[]arr) {
		//確定增量,不斷縮小增量
		for(int i=arr.length/2;i>0;i=i/2) {
			//增量區間頭
			for(int j=0;j<arr.length;j++) {
				//增量區間尾
				for(int k=j+1;k<arr.length;k+=i) {
					//增量區間頭大於尾,則交換。否則,向下執行。
					if(arr[j]>arr[k]) {
						int temp=arr[j];
						arr[j]=arr[k];
						arr[k]=temp;
					}
				}
			}
		}
	}
}

 

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