1. 程式人生 > >java實現 》從 》 直接插入排序 》到》 希爾排序

java實現 》從 》 直接插入排序 》到》 希爾排序

直接插入排序和希爾排序,把這兩個放一起是便於記憶,這兩個排序是差不多的,希爾排序也只是對插入排序進行一點修改:

首先是看一下我們的插入排序:

package sort;

public class InsertSort {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 5, 4, 6 };
		sort(arr);
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}

	public static void sort(int[] arr) {
		for (int i = 1; i < arr.length; i++) {
			int insertNum = arr[i];// 待插入
			for (int j = i - 1; j >= 0; j--) {

				if (insertNum < arr[j]) {
					arr[j + 1] = arr[j];
				} else {

					arr[j + 1] = insertNum;
					break;
				}

			}
		}
	}
}

控制檯如下:

下邊講解我們希爾排序:

package sort;

public class SheelSort {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 5, 4, 6 };
		sort(arr);
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}

	public static void sort(int arr[]) {
		int divideNum = arr.length / 2;

		while (divideNum != 0) {
			for (int k = 0; k < divideNum; k++) {
				for (int i = k + divideNum; i < arr.length; i = i + divideNum) {
					int InsertNum = arr[i];
					for (int j = i - divideNum; j >= 0; j = j - divideNum) {
						if (InsertNum < arr[j]) {
							arr[j + divideNum] = arr[j];
						} else {
							arr[j + divideNum] = InsertNum;
							break;
						}
					}
				}
			}

			divideNum = divideNum / 2;
		}
	}
}

輸出:

 

我們看到希爾排序中就相當於是多了兩層迴圈,第一層迴圈是:為了進行分塊處理,而且不斷的細分一直到間隔是1位置。第二層迴圈表示有多少個這種子塊,有多少子塊就要進行多少次的插入排序。