iOS 算法总结

1. 不用中间变量,用两种方法交换A 和 B的值

func arithmetic1 () {
        var a = 10
        var b = 15
        swap11(&a, &b)
        swap22(&a, &b)
        print("a:\(a)------b:\(b)")
    }

    func swap11(_ a: inout Int,_ b: inout Int) {
        a = a + b
        b = a - b
        a = a - b
    }
    
    func swap22(_ a: inout Int,_ b: inout Int) {
        a = a^b
        b = a^b
        a = a^b
    }

    func swap33(_ a: inout Int,_ b: inout Int) {//Swift 里的元组
        (a,b) = (b,a)
    }

2. 求两个数的最大公约数

func arithmetic2 () {
        var a = 80
        var b = 30
        var c = a
        if a > b {
            c = b
        }
        
        var maxNum = 1
        while a%b > 0 {
            maxNum = a%b
            a = b
            b = maxNum
        }
        print("\(a)和\(b)的最大公约数是:\(maxNum)")
    }

3. 冒泡排序

//冒泡排序1
    func arithmetic3 () {
        var arr = [1,232,32,434,42,45,65,657,64,32]
        var i = 0
        var j = 1
        while j<(arr.count) {
            i = 0
            while i<(arr.count - j) {
                if arr[i] <= arr[i + 1] {
                    arr[i] = arr[i] + arr[i + 1]
                    arr[i + 1] = arr[i] - arr[i + 1]
                    arr[i] = arr[i] - arr[i + 1]
                }
                i += 1
            }
            j += 1
            
        }
        print(arr)
    }
    
    //冒泡排序2
    func arithmetic4 () {
        var arr = [1,232,32,434,42,45,65,657,64,32]
        var i = 0
        var j = 0
        var maxIndex = 0
        var temp = 0
        while j<arr.count {
            temp = arr[j]
            i = j
            while i<arr.count {
                if temp <= arr[i] {
                    temp = arr[i]
                    maxIndex = i
                }
                i += 1
            }
            arr[maxIndex] = arr[j]
            arr[j] = temp
            j += 1
            
        }
        print(arr)
    }

4. 插入排序

func arithmetic5 () {
        var arr = [1,232,32,434,42,45,65,657,64,32]
        var i = 0
        var j = 0
        var newArr:[Int] = []
        while j<arr.count {
            if newArr.count == 0 {
                newArr.append(arr[j])
            } else {
                i = 0
                while i<newArr.count {
                    if arr[j] >= newArr[i] {
                        newArr.insert(arr[j], at: i)
                        break
                    }
                    i += 1
                }
            }
            j += 1
        }
        print(newArr)
    }

5. 斐波那契数 递归法

func fibna(n:Int) -> Int {
        if(n == 0) {
            return 0
        }
        if n == 1 || n == 2 {
            return 1
        }
        return fibna(n: n-1) + fibna(n: n-2)
    }

6. 递归排序

    let dataArr = [1,8,9,4,3,4,3,2,1]
    study2(head_i: 0, end_j: dataArr.count - 1, dataArrGet: dataArr)
    func study2(head_i:Int,end_j:Int,dataArrGet: [Int]){//{1,8,9,4,3,4,3,2,1}
        var dataArr = dataArrGet
        var i = head_i,j = end_j;
        while i <= j {
            var num = 0
            if dataArr[i] > dataArr[dataArr.count/2] {
                num += 1
            }else{
                i += 1;
            }
            
            if dataArr[j] < dataArr[dataArr.count/2] {
                num += 1
            }else{
                j -= 1;
            }
            if num == 2 {
                let temp = dataArr[i]
                dataArr[i] = dataArr[j]
                dataArr[j] = temp;
                i += 1
                j -= 1
            }
        }
        print(dataArr)
    }

7 快速排序

var m = [2,3,5,7,1,4,6,15,5,2,7,9,10,15,9,17,12]
quickSort(a: &m, low: 0, high: m.count - 1)
func quickSort(a: inout [Int], low: Int, high: Int) {
        if low >= high { // 递归结束条件
            return
        }
        var i = low
        var j = high
        let key = a[i]
        while i < j {
            // 从右边开始比较,比key大的数位置不变
            while i < j && a[j] >= key {
                j -= 1
            }
            // 只要出现一个比key小的数,将这个数放入左边i的位置
            a[i] = a[j]
            // 从左边开始比较,比key小的数位置不变
            while i < j && a[i] <= key {
                i += 1
            }
            // 只要出现一个比key大的数,将这个数放入右边j的位置
            a[j] = a[i]
        }
        a[i] = key // 将key放入i的位置,则左侧数都比key小,右侧数都比key大
        quickSort(a: &a, low: low, high: i - 1) // 左递归
        quickSort(a: &a, low: i + 1, high: high) // 右递归
    }

8 经典汉诺塔

func study1(){
        /*
         经典汉诺塔 问题描述:假设有3个分别命名为X,Y,Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2,……n个圆盘。现要求将X轴上的n个圆盘移至塔座Z上并仍按同样顺序叠排,圆盘移动时必须遵守下列规则:
         (1)每次只能移动一个圆盘;
         (2)圆盘可以插在X,Y和Z中的任一塔座上;
         (3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
         求n个盘至少需移动的次数。
         
         1 共1次  第1个 1次
         2 共3次  第2个 1次  第1个 2次
         3 共7次  第3个 1次  第2个 2次  第1个 4次
         4 共15次 第4个 1次  第3个 2次  第2个 4次  第1个 8次
         5 共31次 第5个 1次  第4个 2次  第3个 4次  第2个 8次  第1个 16次
 */
        let n = 10
        var result = 0
        for i in 1...n {
            result = result + 1<<(i-1)
        }
        
        print(result)
        print(1<<n - 1)
    }

 /*如果输入3,打印
     1 2  3
     8 9 4
     7 6 5
     如果输入4,打印
     1     2    3  4
     12  13  14  5
     11   16  15  6
     10  9   8   7*/
    func study() {
        let n = 8;// 定义输入的数字
        var arr = Array(repeating:0, count:n*n) //构造一个数组
        
        var k = 0 //圈数 如上图, 最外围算第 0 圈 红色部分为第1圈
        var kx = (n - 1 - 2*k)*4 // 记录第 k 圈的元素总数
        var r = 0 //  表示第n层的第几个元素
        for index in 1...(n*n) {
            if index <= kx {
                //print("value:\(index)第\(k)层-- 第\(r)个数")
            }else{//如果走else 那么 index 就是 29 49 等,圆圈的左上角第一个数
                r = 0 // 需要置0
                k += 1 //  圈数+1
                kx += (n - 1 - 2*k)*4 //之前累计的圈的元素数
                //print("value:\(index)第\(k)层-- 第\(r)个数")
            }
            var thisIndex = 0// 定义元素的index位置
            if (r < (n - 2*k)) {//上横   (n - 2*k) 表示的是 index 7 14 21 的位置.参照图求
                thisIndex = n*k + k + r //记录着 上横 数值 1-8 应该所在的 位置 以下类推(根据四个角的元素数值去类推)
            }else if (r < (2*(n-2*k) - 1)) {//右竖
                thisIndex = (n-1)*(k+1) + (r - (n - 2*k))*n + n
            }else if(r < (3*(n-2*k) - 2)){// 下横
                thisIndex = n*n - (n+1)*k - 3 - (r - (n-2*k)*2)
            }else{
                thisIndex = n*(n - 1) - k*(n - 1)  - ( r - (3*(n-2*k) - 2) + 1)*n
            }
            arr[thisIndex] = index// 替换相应位置的元素
            r = r + 1//元素位置+1
        }
        
        //打印输出
        for (index, value) in arr.enumerated() {
            if (index + 1)%n == 0 {
                print("\(value) ")
            }else{
                print("\(value) ", terminator: "")
                if value < 10 {
                    print("  ", terminator: "")
                } else if value < 100 {
                    print(" ", terminator: "")
                }
            }
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值