1. 程式人生 > >插入排序和希爾排序--java

插入排序和希爾排序--java

插入排序

插入排序的程式碼實現雖然沒有氣泡排序和選擇排序那麼簡單粗暴,但它的原理應該是最容易理解的了,因為只要打過撲克牌的人都應該能夠秒懂。插入排序是一種最簡單直觀的排序演算法,它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。
插入排序和氣泡排序一樣,也有一種優化演算法,叫做拆半插入。
程式碼:InsertSort.java

import java.util.Date;

public class InsertSort {

	public static void main(String[] args) {
		InsertSort insertSort=new InsertSort();
		int[] array={33,45,12,45,46,43,90,34,57,80,123,343,54,35453,534,623,64};
		Date beginTime=new Date();
		System.out.println("beginTime:"+beginTime);
		insertSort.sort(array);
		Date endTime=new Date();
		System.out.println("endTime:"+endTime);
		System.out.println("耗時(ms)"+(endTime.getTime()-beginTime.getTime()));
		for(int i=0;i<array.length ;i++)
		System.out.print(array[i]+",");


	}

	public int[] sort(int[] arr){
		for(int i=0;i<arr.length;i++){
			int temp=arr[i];
			int j=i;
			while(j>0&&temp<arr[j-1]){
				arr[j]=arr[j-1];
				j--;
			}
			if(i!=j){
				arr[j]=temp;
			}			
		}
		return arr;
		
	}
}

結果:
beginTime:Mon Dec 03 14:07:15 CST 2018
endTime:Mon Dec 03 14:07:15 CST 2018
耗時(ms)21
12,33,34,43,45,45,46,54,57,64,80,90,123,343,534,623,35453,

希爾排序

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序演算法。

希爾排序是基於插入排序的以下兩點性質而提出改進方法的:

插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到線性排序的效率;
但插入排序一般來說是低效的,因為插入排序每次只能將資料移動一位;
希爾排序的基本思想是:先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄進行依次直接插入排序。
演算法步驟
1.選擇一個增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;

2.按增量序列個數 k,對序列進行 k 趟排序;

3.每趟排序,根據對應的增量 ti,將待排序列分割成若干長度為 m 的子序列,分別對各子表進行直接插入排序。僅增量因子為 1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。

程式碼:HillSort.java

import java.util.Date;

public class HillSort {

	public static void main(String[] args) {
		HillSort hillSort=new HillSort();
		int[] array={33,45,12,45,46,43,90,34,57,80,123,343,54,35453,534,623,64};
		Date beginTime=new Date();
		System.out.println("beginTime:"+beginTime);
		hillSort.sort(array);
		Date endTime=new Date();
		System.out.println("endTime:"+endTime);
		System.out.println("耗時(ms)"+(endTime.getTime()-beginTime.getTime()));
		for(int i=0;i<array.length ;i++)
		System.out.print(array[i]+",");

	}
	
	public int[] sort(int[] arr){	
		int gap = 1;
        while (gap < arr.length) {
            gap = gap * 3 + 1;
        }

        while (gap > 0) {
            for (int i = gap; i < arr.length; i++) {
                int tmp = arr[i];
                int j = i - gap;
                while (j >= 0 && arr[j] > tmp) {
                    arr[j + gap] = arr[j];
                    j -= gap;
                }
                arr[j + gap] = tmp;
            }
            gap = (int) Math.floor(gap / 3);
        }	
		return arr;
		
	}

}

結果:
beginTime:Mon Dec 03 14:39:24 CST 2018
endTime:Mon Dec 03 14:39:24 CST 2018
耗時(ms)24
12,33,34,43,45,45,46,54,57,64,80,90,123,343,534,623,35453,