算法的一点一滴

Posted by syea on March 8, 2018

算法的一点一滴

最近急于强补算法知识去面大公司,经过自己不自量力地在 leetcode 上做了几题算法题后,终于静下心来。 急功近利的焦躁的样子真是太low了,不会就一点点学,希望以后能更好地调整自己心态。

从排序入门

仿佛所有算法教程都从排序讲起。虽然现在在编码时都是调个 api 就完事了,但是其中的思想还是值得学习研究的。
[8,2,3,7,5,6,4,1],将该数组从小到大排列。

选择排序

肉眼一看就知道,1最小,就先把1排出来 -> [1]
然后是2 -> [1,2]

最后排序完成

第 1 次找了 n-1 次,第 2 次找了 n-2 次,第 3 次找了 n-3 次…
共 n(n-1)/2 次

代码示例:

func choseSorting(nums: [Int]) -> [Int] {
    guard nums.count > 0 else {
        return []
    }
    var temp = nums
    var result = [Int]()
    while temp.count != 0 {
        var m = temp.first!
        var mi = 0
        for i in 0..<temp.count {
            if m > temp[i] {
                m = temp[i]
                mi = i
            }
        }
        result.append(m)
        temp.remove(at: mi)
    }
    return result
}

插入排序

请在脑海里想象扑克牌理牌的情形! 先随机取一个数扔到一个新的数组,比如取了2 -> [2]
再从剩下的数中随机取一个数,按指定的顺序插入,比如取了7 -> [2,7]
再从剩下的数中随机取一个数,按指定的顺序插入,比如取了4 -> [2,4,7]
再从剩下的数中随机取一个数,按指定的顺序插入,比如取了8 -> [2,4,7,8]

最后排序完成

第 1 次比较了 0 次,第 2 次比较了 1 次,第 3 次最多需要比较 2 次,第 4 次最多需要比较 3 次…
共 n(n-1)/2 次

代码示例:

func insertSorting(nums: [Int]) -> [Int] {
    guard nums.count > 0 else {
        return []
    }
    var temp = nums
    var result = [Int]()
    
    result.append(nums.first!)
    temp.removeFirst()
    
    while temp.count != 0 {
        let n = temp.first!
        for i in 0..<result.count{
            if n < result[i] {
                result.insert(n, at: i)
                break
            }
            result.append(n)
        }
        temp.removeFirst()
    }
    return result
}

冒泡排序

[8,2,3,7,5,6,4,1]
首先比较第一个数字跟第二个数字 -> [2,8,3,7,5,6,4,1]
然后比较第二个数字跟第三个数字 -> [2,3,8,7,5,6,4,1]
然后比较第三个数字跟第四个数字 -> [2,3,7,8,5,6,4,1]
然后比较第四个数字跟第五个数字 -> [2,3,7,5,8,6,4,1]

一次排序后,8就会到达数组的最后一个位置
然后再对前面的数字同样的方式进行一次

第 1 次排了 n-1 次,第 2 次排了 n-2 次,第 3 次排了 n-3 次…
共 n(n-1)/2 次

代码示例:

func bubbleSorting(nums: [Int]) -> [Int] {
    guard nums.count > 0 else {
        return []
    }
    var temp = nums
    var i = temp.count - 1
    while i != 0 {
        for j in 0..<i {
            if temp[j] > temp[j + 1]{
                let t = temp[j]
                temp[j] = temp[j + 1]
                temp[j + 1] = t
            }
        }
        i -= 1
    }
    return temp
}

快速排序

待研究