資料結構與演算法分析-Java描述(2)-插入排序
阿新 • • 發佈:2018-12-18
插入排序有兩種演算法:直接插入排序和希爾排序
直接插入排序
原理:插入即表示將一個新的資料插入到一個有序陣列中,並繼續保持有序。
該排序演算法的外部迴圈為遍歷全部元素,內部迴圈為遍歷當前外部迴圈記錄元素的前面所有數字。
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; } } } } }