1. 程式人生 > >排序演算法之希爾排序【java實現】

排序演算法之希爾排序【java實現】

前面介紹的冒泡、選擇、插入排序演算法雖然簡單直觀,但是在排序上的效率一般。對於大量的資料排序就需要更加高效的演算法,那麼下面來介紹一下高效的排序演算法----希爾排序,又稱Shell排序,縮小增量排序。

實際上,希爾排序是基於插入排序的思想。

實現步驟:

(1)將有n個元素的陣列分成n/2的數字序列,第一個資料和第n/2+1個數據為一對。

(2)一次迴圈使每一個序列對排好序。

(3)然乎,在變為n/4個序列,再次排序。

(4)不斷重複上述過程,隨著序列減少最後變為一個,也就完成了整個序列。

package zhgyu.sort;

public class ShellSort {

	static final int SIZE = 10;
	
	static void shellSort(int[] arr) {
		
		int temp,r;
		int i,j,k;
		int x = 0;
		
		for(r = arr.length/2; r >= 1; r /= 2) {
			for(i = r; i < arr.length; i++) {
				temp = arr[i];
				j = i - r;
				while(j >= 0 && arr[j] > temp) {
					arr[j+r] = arr[j];
					j -= r;
				}
				arr[j+r] = temp;
			}
			
			x++;
			System.out.print("第"+ x +"次的排序結果:");
			for(k = 0; k < arr.length; k++) {
				System.out.print(arr[k] + "\t");
			}
			System.out.println();
		}
	}
	
	public static void main(String[] args) {
		int[] arr = new int[SIZE];
		int i;
		
		for(i = 0; i < SIZE; i ++) {
			arr[i] = (int)(Math.random()*(100 + 1));
		}
		//排序前的陣列
		System.out.print("排序前的陣列:" + "\t");
		for(i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + "\t");
		}
		System.out.println();
		
		//呼叫插入排序演算法
		shellSort(arr);
		
		//排序後的陣列
		System.out.print("排序前的陣列:" + "\t");
		for(i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + "\t");
		}
		System.out.println();

	}
}