使用 Swift3.0 实现“插入排序”算法

//需要 Swift 3.0 环境

//从小到大排序

var a = [6, 5, 4, 3, 2, 1]
print("a is \(a)")

//从第二个开始遍历到最后一个
for j in 1...a.count-1 {
    //保留第 j 个的值,因为后面的操作会修改数组
    let n = a[j]
    print("now moving by \(n)")
    
    //记录 j-1
    var i = j - 1
    //当前面还有数,并且前面的数比保留值大,则前后数交换位置
    while i >= 0 && a[i] > n {
        print("change \(a[i+1]) and \(a[i])")
        
        let temp = a[i+1]
        a[i+1] = a[i]
        a[i] = temp
        
        //继续判断前面的数
        i = i - 1
        
        print("j = \(j) and i = \(i) and a = \(a)")
    }
    print("")
}

//排序完成
print("sorted a is \(a)")
}

之后在Terminal运行swift Numbers.swift即可看到输出

a is [6, 5, 4, 3, 2, 1]
now moving by 5
change 5 and 6
j = 1 and i = -1 and a = [5, 6, 4, 3, 2, 1]

now moving by 4
change 4 and 6
j = 2 and i = 0 and a = [5, 4, 6, 3, 2, 1]
change 4 and 5
j = 2 and i = -1 and a = [4, 5, 6, 3, 2, 1]

now moving by 3
change 3 and 6
j = 3 and i = 1 and a = [4, 5, 3, 6, 2, 1]
change 3 and 5
j = 3 and i = 0 and a = [4, 3, 5, 6, 2, 1]
change 3 and 4
j = 3 and i = -1 and a = [3, 4, 5, 6, 2, 1]

now moving by 2
change 2 and 6
j = 4 and i = 2 and a = [3, 4, 5, 2, 6, 1]
change 2 and 5
j = 4 and i = 1 and a = [3, 4, 2, 5, 6, 1]
change 2 and 4
j = 4 and i = 0 and a = [3, 2, 4, 5, 6, 1]
change 2 and 3
j = 4 and i = -1 and a = [2, 3, 4, 5, 6, 1]

now moving by 1
change 1 and 6
j = 5 and i = 3 and a = [2, 3, 4, 5, 1, 6]
change 1 and 5
j = 5 and i = 2 and a = [2, 3, 4, 1, 5, 6]
change 1 and 4
j = 5 and i = 1 and a = [2, 3, 1, 4, 5, 6]
change 1 and 3
j = 5 and i = 0 and a = [2, 1, 3, 4, 5, 6]
change 1 and 2
j = 5 and i = -1 and a = [1, 2, 3, 4, 5, 6]

sorted a is [1, 2, 3, 4, 5, 6]

如果我们想要从大往小排序,只需要修改while i >= 0 && a[i] > n {...}while i >= 0 && a[i] < n {...}就可以了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,776评论 0 33
  • 忘了上次这种内心空荡荡的感觉是什么时候了,那种大浪拍打着礁岩却发不出一点声音。我已经忘记看到那个的时候脑子里想的是...
    白菜沫君阅读 318评论 0 1