简单算法

144 阅读3分钟

数组反序

//遍历交换
let count = list.count / 2
for idx in 0..<count {
    list.swapAt(idx, list.count - 1 - idx)
}
//遍历增加删除
for index in 0..<list.count - 1 {
    list.insert(list[0], at: list.count - index)       
    list.remove(at: 0)
}
//新数组
var newList = [Int]()
for idx in 0..<list.count {
    newList.insert(list[idx], at: 0)
}

数组去重

//通过字典去重
var originArray = [1, 2, 3, 3, 4, 1, 5]
var transDict = [Int: Int]()
_ = originArray.map { transDict[$0] = $0 }
let _ = transDict.keys    
//通过集合转换去重
var transSet = Set(originArray)
let _ = Array(transSet)
//数组自身遍历去重
for i in 0..<originArray.count {
    var j = originArray.count - 1
    while j > i {
        if originArray[j] == originArray[i] {
            originArray.remove(at: j)
        }
        j -= 1
    }
}

冒泡

//重复的访问要排序的元素,依次比较相邻两个元素,
//如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成

var originArray = [2,7,5,1,4,6,9,0,8,3]
let count = originArray.count // 10
for i in 0..<count - 1 {
    for j in 0..<(count - 1 - i) {  //将筛选出的数据放置在末尾
        if originArray[j] > originArray[j + 1] { //控制升序还是降序
            let temp = originArray[j + 1]
            originArray[j + 1] = originArray[j]
            originArray[j] = temp
        }
    }
}

选择排序

//每遍历一次都记住了当前最小(大)元素的位置,最后仅需一次交换操作即可将其放到合适的位置

var originArray = [2,7,5,1,4,6,9,0,8,3]
let count = originArray.count
var min:Int!
for i in 0..<count - 1 {
    min = i
    for j in (i + 1)..<count {
        if originArray[min] > originArray[j] {//选择min还是max
            min = j
        }
    }
    if min != i {
        let temp = originArray[min]
        originArray[min] = originArray[i]
        originArray[i] = temp
    }
}

插入排序

//每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

var originArray = [2,7,5,1,4,6,9,0,8,3]
let count = originArray.count

//不太贴合插入的思路
for i in 1..<count {
    var j = i
    while j > 0 && (originArray[j] < originArray[j - 1]) {
    //控制升序还是降序,依次与前一位比较,根据结果是否移动
        originArray.swapAt(j + 1, j)
        j -= 1
    }
}

//更新方法
for i in 1..<count {
    if originArray[i] < originArray[i - 1] {
        let temp = originArray[i]
        var j = i - 1
        while j >= 0 && originArray[j] > temp {
            originArray[j + 1] = originArray[j]
            j -= 1
        }
        originArray[j + 1] = temp
    }
}

希尔排序

//将相距某个“增量”的元素组成子序列,对子序列进行插入排序,实现跳跃式移动,提高排序效率。
//一般使用 increment = increment / 3 + 1 
//或者     increment = increment / 2    选取增量

var increment = count
repeat {
    increment = increment / 2
    for i in increment..<count {    
        if originArray[i] < originArray[i - increment] {
            let temp = originArray[i]
            var j = i - increment
            while j >= 0 && temp < originArray[j] {
                originArray[j + increment] = originArray[j]
                j -= increment
            }
            originArray[j + increment] = temp 
        }
    }
} while increment > 1

快速排序

//通过一辞排序将待排序列分割成独立的两部分,
//其中一部分记录的元素均比另一部分记录的元素值小,则可分别对这两部分继续进行排序,
//以达到整个序列有序的目的 

func quickSort(list: inout [Int], low: Int, high: Int) {
    if low < high {
        let pivot = partition(list: &list, low: low, high: high)
        quickSort(list: &list, low: low, high: pivot - 1)
        quickSort(list: &list, low: pivot + 1, high: high)
    }
}

//分隔方法,快排核心
func partition(list: inout [Int], low: Int, high: Int) -> Int {
    let key = list[low]
    var inHigh = high
    var inLow = low
    
    while inLow < inHigh {
        while (inLow < inHigh) && (list[inHigh] >= key){
            inHigh -= 1
        }
        list.swapAt(inLow, inHigh)
        while (inLow < inHigh) && (list[inLow] <= key) {
            inLow += 1
        }
        list.swapAt(inLow, inHigh)
    }
    return inLow
}