美文网首页
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常用算法实现----数组排序

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