美文网首页
Swift常用算法实现----数组排序

Swift常用算法实现----数组排序

作者: 青山不改 | 来源:发表于2019-03-15 15:56 被阅读0次

常用算法总结,锻炼一下思维😀

冒泡排序:

  • 1:比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  • 2:对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  • 3:针对所有的元素重复以上的步骤,除了最后一个。
  • 4:持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
       func bubbleSort<T: Comparable>(array: [T]) -> [T] {
        //如果数组只有一个元素,直接返回
        guard array.count > 1 else{
            return array
        }
        var tempArr = array
        let count = array.count
        for i in 0...(count-1) {
            for j in 0..<(count - i - 1){
                //比较两个元素,如果前面的比后面的大,就交换位置,其他情况不动,继续下一轮比较
                if tempArr[j] > tempArr[j+1]{
                    let temp = tempArr[j+1]
                    tempArr[j+1] = tempArr[j]
                    tempArr[j] = temp
                }
            }
        }
        return tempArr
    }

外层循环所有元素,内层循环除了最后一位的元素,每次都把最大的元素放在最后,直到循环完毕。

快排:

  • 1:从数列中挑出一个元素,称为 “基准”(pivot)。
  • 2: 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面,相同的放在中间。
  • 3:递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
    func quickSort<T: Comparable>(array:[T]) -> [T] {
        //如果数组只有一个元素,直接返回
        guard array.count > 1 else {
            return array
        }
        let pivot = array[array.count/2]//取出中间位置的值作为基准
        let less = array.filter { $0 < pivot }//过滤小于基准的值,返回一个数组
        let equal = array.filter { $0 == pivot }//过滤等于基准的值,返回一个数组
        let greater = array.filter { $0 > pivot }//过滤大于基准的值,返回一个数组
        
        return quickSort(array: less) + equal + quickSort(array: greater)//利用递归,返回最后的有序数组
    }

归并排序:

  • 1:把长度为n的输入序列分成两个长度为n/2的子序列。
  • 2:对这两个子序列分别采用归并排序。
  • 3:将两个排序好的子序列合并成一个最终的排序序列。
    func mergeSort<T: Comparable>(array: [T]) -> [T] {
        //如果数组只有一个元素,直接返回
        guard array.count > 1 else{
            return array
        }
        
        let count = array.count
        
        let middle = count/2//取中间位置
        let left = Array(array.prefix(upTo: middle))//取左边数组
        let right = Array(array.suffix(from: middle))//取右边数组
        
        //利用递归,合并左边和右边的数组
        return merge(left: mergeSort(array: left), right: mergeSort(array: right))
    }

    
    func merge<T: Comparable>(left: [T], right: [T]) -> [T] {
        
        var tempLeft = left
        var tempRight = right
        
        var result = Array<T>()
        
        //当两个数组都有值的时候
        while tempLeft.count > 0 && tempRight.count > 0 {
            
            if tempLeft[0] <= tempRight[0]{
                //如果左边的第一个元素大于右边的第一个元素,就取出左边的第一元素放到result数组里
                result.append(tempLeft.removeFirst())
            }else{
                //如果左边的第一个元素小于右边的第一个元素,就取出右边的第一元素放到result数组里
                result.append(tempRight.removeFirst())
            }
        }
        
        //当只剩下左边数组的时候,合并到result数组
        if tempLeft.count > 0{
            result += tempLeft
        }
        
        //当只剩下由边数组的时候,合并到result数组
        if tempRight.count > 0{
            result += tempRight
        }
        
        return result
        
    }

插入排序:

  • 1:从第一个元素开始,该元素可以认为已经被排序。
  • 2:取出下一个元素,在已经排序的元素序列中从后向前扫描。
  • 3:如果该元素(已排序)大于新元素,将该元素移到下一位置。
  • 4:重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。
  • 5:将新元素插入到该位置后。
  • 6:重复步骤2~5。
    func insertionSort<T: Comparable>(array: [T]) -> [T] {
        
        //如果数组只有一个元素,直接返回
        guard array.count > 1 else{
            return array
        }

        let count = array.count
        var preIndex: Int
        var current: T
        
        var tempArr = array
        
        for i in 1..<count {
            preIndex = i - 1
            current = tempArr[i]
            
            while preIndex >= 0 && tempArr[preIndex] > current{
                tempArr[preIndex+1] = tempArr[preIndex]
                preIndex -= 1
            }
            tempArr[preIndex+1] = current
        }
        
        return tempArr
    }

还有其他的一些排序方法,以后再写吧,当然,Swift数组已经有排序方法:

public func sorted() -> [Element]//返回排序后的数组,默认升序

public func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]//利用闭包返回想要的排序数组

相关文章

  • Swift常用算法实现----数组排序

    常用算法总结,锻炼一下思维? 冒泡排序: 1:比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2:对每一对...

  • Java语言——数组排序算法

    数组有很多常用的算法,包括冒泡排序、直接选择排序和反转排序。 一、冒泡排序 冒泡排序是最常用的数组排序算法之一,它...

  • Swift3.0 数组和字典的排序问题

    简单的实现swift中字典和数组内部排序问题,不用再单独写一个算法来实现排序了,简单快捷~ 1.数组元素从小到大排...

  • PHP常用数组排序算法

    title: PHP常用数组排序算法tags: [PHP,数组,排序,算法] 这几天写到的代码中,用到了许多对数组...

  • python 排序算法

    文章概述 介绍各大常用经典的排序算法和效率,以及python实现常用算法(冒泡排序,选择排序,快速排序,插入排序)...

  • 快速排序(Java)

    快速排序算法思想: (1)输入的数据信息:输入一个待排序的数组a[n],利用QuickSort算法实现此数组的排序...

  • 常用排序算法

    常用的排序算法 在此总结一下常用排序算法的代码实现 #include using namespace std;t...

  • Python一行代码实现快速排序

    上期文章排序算法——(2)Python实现十大常用排序算法为大家介绍了十大常用排序算法的前五种(冒泡、选择、插入、...

  • swift中几种排序算法原理的UI动态实现

    swift中的排序算法总结 冒泡排序 选择排序 快速排序 插入排序 堆排序 归并排序 系统排序 我们将这几种数组排...

  • Scala菜鸟进阶之路之数组相关操作三

    常用算法 1、求和 2、min和max 3、sorted方法将数组或数组缓冲排序并返回经过排序的数组或数组缓冲,这...

网友评论

      本文标题:Swift常用算法实现----数组排序

      本文链接:https://www.haomeiwen.com/subject/noilmqtx.html