iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0

[x]插入排序

上集解答

import java.util.Queue
import java.util.LinkedList

fun main(){
    var a = arrayOf<Int>(415,3,3,34,542,7,2345,4,32,32,765,5,6,9,658)
    for(i in 0..a.size-1){
        for(j in 0..a.size-2-i){
            if(a[j] > a[j+1]){
                var temp = a[j]
                a[j] = a[j+1]
                a[j+1] = temp
            }
        }
    }
    for(i in 0..a.size-1){
        println("${a[i]}")
    }
}

其實只要在內部回去跑到a.size-2-i就夠了,這是因為跑一趟,就會完成右邊的一格,所以右邊的就不需要再去檢查,就可以省下一些時間了。

插入排序

插入排序也是經典排序之一,他的作法也非常的直覺,時間複雜度是O(N²)。

做法是建立另一個陣列B,然後一個個放入B陣列,在放入時找到他適合的位置。

var size = 15
var a = arrayOf<Int>(415,3,3,34,542,7,2345,4,32,32,765,5,6,9,658)
var b = Array<Int>(size){0}
b[0] = a[0]
for(i in 1..size-1){
    var j=i-1
    while ( j>=0 && b[j]>a[i] ){
        b[j+1]=b[j]
        j-=1
    }
    b[j+1]=a[i]
}

那不過細心的觀眾會發現,其實沒有必要多第二個陣列,我們完全可以在原本陣列做一樣的事情喔。

讓我們施一些小魔法~


fun main(){
    var size = 15
    var a = arrayOf<Int>(415,3,3,34,542,7,2345,4,32,32,765,5,6,9,658)
    for(i in 1..size-1){
        var now_number = a[i]
        var j=i-1
        while ( j>=0 && a[j]>now_number ){
            a[j+1]=a[j]
            j--
        }
        a[j+1]=now_number
    }
    for(i in 1..14){
        print("${a[i]} ")
    }
}

我們的插入排序就完成啦。

要注意由於這次會取代掉正要排序的那格的數字,所以我們需要先存起來喔。


上一篇
[Day24][演算法]泡沫排序
下一篇
[Day26] [演算法]二分搜
系列文
櫛風風的「完全不會寫程式,從零開始的 Kotlin 教學」30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言