排序:插入排序法(Java,Kotlin)

定義

插入排序法定義

無聊的解釋(百度百科):
假設我們輸入的是 5,1,4,2,3 我們從第二個數字開始,這個數字是1,我們的任務只要看看1有沒有正確的位置,我們的做法是和這個數字左邊的數字來比,因此我們比較1和5,1比5小,所以我們就交換1和5,原來的排列就變成了 1,5,4,2,3
接下來,我們看第3個數字有沒有在正確的位置。這個數字是4,它的左邊數字是5,4比5小,所以我們將4和5交換,排列變成了 1,4,5,2,3我們必須繼續看4有沒有在正確的位置,4的左邊是1,1比4小,4就維持不動了,以此類推。。。

插入排序的日常應用

簡單示例

工具類SortUtils

Java示例代碼

兩種:1.交換;2.賦值

public class InsertSort {
    public static void main(String[] args) {
        int[] arr = SortUtils.getRandomIntArray(10000, 1, 1000);
        insertSort2(arr);
        SortUtils.printArray(arr);
    }

    private static void insertSort(int[] arr) {
        int length = arr.length;
        for (int i = 1; i < length; i++) {
            //尋找元素arr[i]的合適插入位置
            //1.如果j-1位置值比j位置值大,交換
            for(int j=i;j>0;j--){
                if(arr[j]<arr[j-1]){
                    SortUtils.swap(arr,j,j-1);
                }else{
                    break;
                }
            }
        }
    }

    private static void insertSort2(int[] arr) {
        int length = arr.length;
        for (int i = 1; i < length; i++) {
            //尋找元素arr[i]的合適插入位置;
            // 1.提取出arr[i];
            // 2.如果j-1位置的數比j位置值大,j位置值等于j-1位置;
            // 3.把提取出來的值賦值給及位置
            int temp = arr[i];
            int j = i;
            for(;j>0;j--){
                if(arr[j-1]>temp){
                    arr[j] = arr[j - 1];
                }else{
                    break;
                }
            }
            arr[j] = temp;
        }
    }
}

Kotlin

fun main(args: Array<String>) {
    val arr = SortUtils.getRandomIntArray(10000,1,1000)
    insertSortKt2(arr)
    SortUtils.printArray(arr)
}

//交換
fun insertSortKt(arr:IntArray){
    val length =arr.size
    for ((key,value) in arr.withIndex()){
        var j = key
        while (j>0&&(arr[j-1]-arr[j])>0){
            SortUtils.swap(arr,j-1,j)
            j--
        }
    }
}

//賦值
fun insertSortKt2(arr:IntArray){
    val length =arr.size
    for ((key,value) in arr.withIndex()){
        var j = key
        var temp =arr[j]
        while (j>0&&(arr[j-1]-temp)>0){
            arr[j]=arr[j-1]
            j--
        }
        arr[j]=temp
    }
}

后記

  • 賦值的排序方法要比交換的運行速度快。尤其是一些數據基本已經有序,只有幾個無序時,尤其適用。
  • Kotlin不能直接使用工具類中的反射,這個還沒太研究明白=。=
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容