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));
    }

}

測試結果:

四、原理分析

下圖是對插入排序算法每一步排序的理解以及交換思路:

 

五、總結

本文是作者在複習插入排序算法的一些總結以及思路,僅供大家參考學習,一起學習一起進步。