1. 程式人生 > >資料結構與演算法分析-Java描述(2)-插入排序

資料結構與演算法分析-Java描述(2)-插入排序

插入排序有兩種演算法:直接插入排序和希爾排序

直接插入排序

 原理:插入即表示將一個新的資料插入到一個有序陣列中,並繼續保持有序。

該排序演算法的外部迴圈為遍歷全部元素,內部迴圈為遍歷當前外部迴圈記錄元素的前面所有數字。

public static void insertSort(int[] arr) {
	for(int i = 1;i < arr.length;i++) {
                //在保證當前元素之前的數字是有序的情況下
		if(arr[i]<arr[i-1]) {
			//把當前遍歷的數字存起來
			int temp = arr[i];
			int j;
			//遍歷當前元素i前面所有的數字
			for(j = i-1; j>=0 && temp<arr[j] ;j--) {
				//把前一個數字賦給後一個數字
				arr[j+1] = arr[j];
			}
                        //arr[j]不滿足即temp>arr[j],應當放在arr[j]的後面
			//把臨時變數(外層for迴圈的當前元素)賦給不滿足條件的後一個元素
			arr[j+1] = temp;
		}
	}
}

希爾排序

原理:也被稱為“縮小增量排序”,將待排序的陣列元素按照步長分成多個子序列,使得每個子序列的元素個數相對較少,然後對各個子序列分別進行直接插入排序,直到最後步長降為1,再對所有元素進行一次直接插入排序。

該排序演算法屬於直接插入演算法的改進,程式碼簡潔易懂,直接貼。

public static void shellSort(int[] arr) {
	//遍歷所有的步長
	for(int d = arr.length/2 ; d>0 ; d/=2) {
		//遍歷所有的元素
		for(int i=d;i<arr.length;i++) {
			//遍歷本組中所有的元素
			for(int j=i-d ; j>=0 ; j-=d) {
				//如果當前元素大於加上步長後的那個元素
				if(arr[j]>arr[j+d]) {
					int temp = arr[j];
					arr[j] = arr[j+d];
					arr[j+d] = temp;
				}
			}
		}
	}
}