Sort in Swift

var unnumber = [23,76,42,9,7,0,1,37,4,2,89,23,45,56,87,65,20,15,23,15,17]
var number = [19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]
var number2 = [19,18]
var number1 = [19]

//to swap two number
func swapValue(inout left:Int, inout _ right:Int) {
    let temp = left
    left = right
    right = temp
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Insert Sort
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//Straight Insertion Sort
func insertSort(input:[Int]) -> [Int] {
    var output = input
    var temp = 0

    for i in 1..<output.count {
        if output[i] < output[i - 1] {
            temp = output[i]
            output[i] = output[i - 1]
            var j = i - 1
            //记录后移,并且j>=0一定要放在&&前面,否则会出现数组越界的情况
            for ; j >= 0 && temp < output[j]; j-- { output[j + 1] = output[j] }
            //output[j + 1]是由于,循环完了之后,j指向的不是要插入的位置,而是之前的位置:j--
            output[j + 1] = temp
        }
    }
    return output
}
unnumber.sort()
insertSort(unnumber)
insertSort(number)
insertSort(number1)
insertSort(number2)

//Binary Insertion Sort
func insertSortWithBinarySearch(input:[Int]) -> [Int] {
    var output = input
    var temp = 0
    for i in 1..<output.count {
        if output[i] < output[i - 1] {
            temp = output[i]
            output[i] = output[i - 1]
            //由于之前的数组已经是一个有序的数组,可以用折半查找来减少时间
            var low = 0, high = i - 1, min = 0

            while low <= high {
                min = (low + high) / 2
                if output[min] < temp { low = min + 1 }
                else if output[min] > temp { high = min - 1 }
                else {//用来判断相等的情况下,重复的数越多,越能减少比较的次数
                    low = min + 1
                    break
                }
            }
            var j = i - 1
            //一次查找之后low总指向比temp大的一个数,所以包括low在内的数据全部后移,将temp插入到low的前面
            for ; j >= low; j-- { output[j + 1] = output[j] }
            output[j + 1] = temp
        }
    }
    return output
}
unnumber.sort()
insertSortWithBinarySearch(unnumber)
insertSortWithBinarySearch(number)
insertSortWithBinarySearch(number1)
insertSortWithBinarySearch(number2)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Quick Sort
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//Bubble Sort
func bubbleSort(input:[Int]) -> [Int] {
    var output = input

    for var i = 0; i < output.count; i++ {
        for var j = 0; j < output.count - 1; j++ {
            if output[j] > output[j + 1] {
                swapValue(&output[j], &output[j + 1])
            }
        }
    }
    return output
}
unnumber.sort()
bubbleSort(unnumber)
bubbleSort(number)
bubbleSort(number1)
bubbleSort(number2)

//Quick Sort
func quickSort(input:[Int]) -> [Int] {
    var output = input
    //递归,其实可以用闭包来实现,这里为了方便理解,使用嵌套函数来表示
    func quicksort(inout input:[Int], _ low:Int, _ high:Int) {
        guard low < high else { return }//递归完成

        let pivotkey = input[low]
        var left = low
        var righ = high

        while left < righ {
            while left < righ && input[righ] >= pivotkey { --righ }
            input[left] = input[righ]
            while left < righ && input[left] <= pivotkey { ++left }
            input[righ] = input[left]
        }
        //移动轴的位置,使得轴左边的数总比右边的数小
        input[left] = pivotkey

        quicksort(&input, low, left - 1)
        quicksort(&input, left + 1, high)

    }
    quicksort(&output, 0, output.count - 1)
    return output
}
unnumber.sort()
quickSort(unnumber)
quickSort(number)
quickSort(number1)
quickSort(number2)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Select Sort
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//Select Sort
func selectSort(input:[Int]) -> [Int] {
    var output = input

    for var i = 0; i < output.count; i++ {
        for var j = i + 1; j < output.count; j++ {
            if output[i] > output[j] {
                swapValue(&output[i], &output[j])
            }
        }
    }
    return output
}
unnumber.sort()
selectSort(unnumber)
selectSort(number)
selectSort(number1)
selectSort(number2)

//Select Sort Improve
func selectSortImprove(input:[Int]) -> [Int] {
    var output = input
    //递归调用,每次都选出最大最小放到数组的两端
    func selectsortimprove(inout input:[Int], _ low:Int, _ high:Int) {
        guard low < high else { return }

        for var i = low; i <= high; i++ {
            if input[i] > input[high] { swapValue(&input[high], &input[i]) }
            if input[i] < input[low] { swapValue(&input[low], &input[i]) }
        }
        selectsortimprove(&input, low + 1, high - 1)
    }
    selectsortimprove(&output, 0, output.count - 1)

    return output
}
unnumber.sort()
selectSortImprove(unnumber)
selectSortImprove(number)
selectSortImprove(number1)
selectSortImprove(number2)

时间: 2024-10-10 13:20:28

Sort in Swift的相关文章

Swift学习笔记(三)

六 函数 Swift的统一的功能语法足够灵活来表达任何东西,无论是甚至没有参数名称的简单的C风格的函数表达式,还是需要为每个本地参数和外部参数设置复杂名称的Objective-C语言风格的函数.参数提供默认值,以简化函数调用,并通过设置在输入输出参数,在函数执行完成时修改传递的变量. Swift中的每个函数都有一个类型,包括函数的参数类型和返回类型.您可以方便的使用此类型像任何其他类型一样,这使得它很容易将函数作为参数传递给其他函数,甚至从函数中返回函数类型.函数也可以写在其他函数中来封装一个嵌

Swift详解之四-------妈妈再也不用担心我的闭包了

妈妈再也不用担心我的闭包了 注:本文为作者自己总结,过于基础的就不再赘述 ,都是亲自测试的结果.如有错误或者遗漏的地方,欢迎指正,一起学习. swift中闭包是一个很强大的东西,闭包是自包含的函数代码块,可以在代码中被传递和使用.跟C 和 Objective-C 中的代码块(blocks)很相似 .这个大家必须掌握!必须掌握!必须掌握!重要的事情要说三遍 闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包.下面我们就来攻克它! 1.闭包函数

Swift常用语法示例代码(一)

此篇文章整理自我以前学习Swift时的一些练习代码,其存在的意义多是可以通过看示例代码更快地回忆Swift的主要语法. 如果你想系统学习Swift或者是Swift的初学者请绕路,感谢Github上The Swift Programming Language开源翻译的中文版,感谢极客学院wiki提供的PDF版本. 代码和PDF版本上传至Github,有兴趣的可以下载下来试试. SwiftTour Base var str = "Hello, World!" print(str) // 变

The Swift Programming Language-官方教程精译Swift(8)闭包 -- Closures

闭包是功能性自包含模块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似. 闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包.Swift会为您管理在捕获过程中涉及到的内存操作.  注意:如果您不熟悉 捕获 (capturing) 这个概念也不用担心,后面会详细对其进行介绍. 在 函数 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采

Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。

闭包是功能性自包含模块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似. 闭包可以 捕获 和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包.Swift会为您管理在 捕获 过程中涉及到的内存操作. 注意:如果您不熟悉 捕获 (capturing) 这个概念也不用担心,后面会详细对其进行介绍. 在Swift函数章节中介绍的全局和嵌套函数实际上也是特殊的

Swift中文手册 -- Closures

闭包 闭包是功能性自包含模块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似. 闭包可以 捕获 和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包.Swift会为您管理在 捕获 过程中涉及到的内存操作. 注意: 如果您不熟悉 捕获 (capturing) 这个概念也不用担心,后面会详细对其进行介绍. 在 函数 章节中介绍的全局和嵌套函数实际上也是特殊

Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較类似。

闭包是功能性自包括模块,能够在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較相似. 闭包能够 捕获 和存储其所在上下文中随意常量和变量的引用. 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包.Swift会为您管理在 捕获 过程中涉及到的内存操作. 注意:假设您不熟悉 捕获 (capturing) 这个概念也不用操心.后面会具体对其进行介绍. 在Swift函数章节中介绍的全局和嵌套函数实际上也是特殊的

swift学习之闭包(closure)

swift的闭包和c,oc中block是差不多的,其实swift中的全局和嵌套函数实际上也是一种特殊的闭包,闭包有三种形式: (1)全局函数是有一个名字,但不能捕获任何值的闭包 (2)嵌套函数是有一个名字,可以捕获在函数内的值得闭包 (3)闭包表达式是一个轻量级的语法,可以从上下文中捕获值 闭包表达是一个干净,清晰,鼓励简介,优化的语法,优化包括: (1)从上下文中推断参数和返回类型 (2)简单的闭包表达可以省略return (3)简写参数名 (4)尾部闭包语法 (一)闭包表达 闭包表达就是以一

Swift排序Sort函数用法

简书地址:http://www.jianshu.com/p/ad71c94e7bc6 摘自stackoverflow的问答 用了几分钟做的简单翻译 一个例子 直接贴代码,不过多解释 //这是我们的model class imageFile { var fileName = String() var fileID = Int() } //使用 var images : [imageFile] = [] images.sort({ $0.fileID > $1.fileID }) 下面是闭包的进阶使