Java常見排序演算法之插入排序詳解
一、簡介
插入排序,就是假定一個參考值,假設該參考值左邊的元素都有序,那麼從該元素開始從後往前挨個查詢,如果找到比參考值大的數,那麼就將這個大的數後移,如果未找到比參考值大的數,說明不用移動元素。迴圈比較,這樣經過比較後移之後就會空出下標為0的位置,用於存放這個參考值。
二、排序思路
排序思路:(假設從小到大)
【1】 待排序陣列: 5, 6, 3, 7, 2, 1
【2】第一趟: 參考值指向第二個元素6, 假設6左面的元素 5 為有序的,從5開始,6和5比較,因為 6 > 5,沒有找到比6大的數,因此不用右移,於是第一趟結果為: 5,6,3,7,2,1
【3】第二趟: 參考值指向第三個元素3, 經過第一趟排序3左邊的元素 5,6 已經有序,從3開始從後往前挨個比較, 3 < 6,將6往後移,3 < 5,將5也往後移,這時候空出第一個位置用於填充參考值3,於是第二趟排序結果為: 3,5,6,7,2,1
【4】第三趟: 參考值指向第四個元素7, 經過第二趟排序後7左邊的元素 3,5,6 已經有序,從7開始從後往前挨個比較, 7 > 6,7 > 5, 7 > 3,沒有找到比7大的數,因此不用右移,於是第三趟結果為: 3,5,6,7,2,1
【5】第四趟: 參考值指向第五個元素2, 經過第三趟排序後2左邊的元素 3,5,6,7 已經有序,從2開始從後往前挨個比較, 2 < 7,將7往後移, 2 < 6, 將6也往後移; 2 < 5,將5往後移;2 < 3 ,將3也往後移,這時空出第一個位置用於填充參考值2,於是第四趟結果為: 2,3,5,6,7,1
【6】第五趟: 參考值指向第六個元素1, 經過第三趟排序後1左邊的元素 2,3,5,6,7 已經有序,從1開始從後往前挨個比較, 1 < 7,將7往後移,1 < 6,將6也往後移; 1 < 5,將5往後移;1 < 3 ,將3也往後移;1 < 2 ,將2也往後移,這時候空出第一個位置用於填充參考值1,於是第五趟結果為: 1,2,3,5,6,7
【7】元素已經有序,排序完畢。
三、演算法實現
/** * @Description: 插入排序工具類 * @Author: weishihuai * @Date: 2018/10/16 21:31 * <p> * 原理: * 1、從第二個元素開始迴圈遍歷,作為參考值,認定參考值左邊的元素都有序。 * 2、取出參考值的下一個元素,在已經排序的元素序列中從後向前掃描。 * 3、如果該元素(已排序)大於新元素,則將該元素移到下一位置。 * 4、重複步驟3,直到找到已排序的元素小於新元素的位置。 * 5、將新元素插入到該位置。 * 6、重複步驟2。 */ public class InsertSortUtils { public static int[] sort(int[] array) { //從第二個元素開始遍歷即可 for (int i = 1; i < array.length; i++) { //參考值 int temp = array[i]; //從參考值前面一個元素開始從後往前查詢 int j = i - 1; for (; j >= 0; j--) { //假如找到比參考值大,資料往後移 if (array[j] > temp) { array[j + 1] = array[j]; } else { // 跳出迴圈 break; } } array[j + 1] = temp; System.out.println("第" + i + "趟排序後:" + Arrays.toString(array)); } return array; } }
測試:
public class Test {
public static void main(String[] args) {
int[] array = {5, 6, 3, 7, 2, 1};
System.out.println("排序前: " + Arrays.toString(array));
int[] arr = InsertSortUtils.sort(array);
System.out.println("排序後: " + Arrays.toString(arr));
}
}
測試結果:
四、原理分析
下圖是對插入排序演算法每一步排序的理解以及交換思路:
五、總結
本文是作者在複習插入排序演算法的一些總結以及思路,僅供大家參考學習,一起學習一起進步。