1. 程式人生 > >排序演算法之希爾(優化冒泡)排序

排序演算法之希爾(優化冒泡)排序

希爾排序是用來優化其他演算法的,進行分組,初始的gap等於n/2,然後依次減半,直到最後取1.這個1有點特別,如果直接放裡面會導致死迴圈。在分組的for迴圈裡面有點不方便,所以在後面進行for迴圈程式碼修正,單獨寫變數的增值。用if來解決這個死迴圈的問題。分組後進行冒泡,進行gap分組內的值-1此冒泡,同時進行優化,否則當gap=1時就是氣泡排序了,在組內排序,每次比完就加gap,跳過的比。希爾排序的核心思想就是分組,組內排序,再分組,---越來越有序,結合之前的演算法,如果越有序就越快,來優化其他演算法。

package cn.hncu.sorts;

public class SortWay2 {
	//輸出函式
	private static void print(int[] a) {
		for(int num:a){
			System.out.print(num+" ");
		}
		System.out.println();
	}
	//交換陣列位置函式
	private static void swap(int[] a, int j, int i) {
		int temp;
		temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}
	//shellSort排序
	private static void shellSort(int[] a) {
		//進行分組,初始的gap=n/2,然後依次減半,到1為止
		for (int gap=(a.length+1)/2;gap>0;) {
			//分組冒泡   按理來說用冒泡還要進行優化,不然當gap=1就是氣泡排序了
			for (int i = 0; i < a.length-gap; i++) {
				//組內排序
				for (int j = i; j < a.length-gap; j+=gap) {
					if(a[j]>a[j+gap]){
						swap(a, j, j+gap);
					}
				}
			}
			//for迴圈的修正程式碼有點複雜,直接寫在for裡面不方便 單獨寫
			if(gap>1){
				gap=(gap+1)/2;
			}else if(gap==1){
				break;
			}
		}
	}
	public static void main(String[] args) {
		int[] a={21,22,5,7,86,57,9,-2,37,-8};
		//希尓排序
		shellSort(a);
		print(a);
	}
}