堆排序(Swift版本)

一:什么是堆?

堆可视为  “以数组方式存储的一棵完全二叉树”

堆又分为最大堆和最小堆, 最大堆就是对于整个二叉树中的每一个节点都满足:节点的键值比其左右子节点的键值都要大,对应的最小堆则是:节点的键值比其左右子节点的键值都要小

二:堆排序的思路

对于一个存储最大堆的数组arr(长度为size), 根节点arr[0]是所有节点中键值最大,将arr[0]和arr[size-1]的值交换,然后将除去arr[size-1]后的size-1个节点作为一个独立的二叉树,但是此时的这课新的树由于前面交换arr[0]和arr[size-1]的原因需要重新调整为堆。

堆排序就是不断交换和调整的过程。所以我们先要解决两个问题

1.如何调整为最大堆(或者最小堆)

2.如何由一个无序的输入数组生成一个堆

具体代码如下:

调整:输入的参数为一个数组、堆大小和调整的位置(节点对应的数组下标,并假设该节点的左右子树已符合堆性质)

func maxHeapify<Elem: Comparable>(_ arr : inout [Elem], _ size: Int, _ pos: Int) {
    func swap(_ a: inout Elem, _ b: inout Elem) {
        let tmp = a
        a = b
        b = tmp
    }
   
    let l = 2*pos + 1
   
    let r = 2*pos + 2
   
    var index = pos
   
    if l < size && arr[l] > arr[index] {
        index = l
    }
   
    if r < size && arr[r] > arr[index] {
        index = r
    }
   
    if index != pos {
        swap(&arr[pos], &arr[index])
        maxHeapify(&arr, size, index)
    }
}

如何建立堆:输入的参数是一个无序的数组(一个从底向上的调整过程)

func buildMaxHeap<Elem: Comparable>(_ arr: inout [Elem]) {
    let bounce = arr.count/2 - 1
   
    for i in (0...bounce).reversed() {
        maxHeapify(&arr, arr.count, i)
    }
}

堆排序:

func heapSort<Elem: Comparable>(_ arr: inout [Elem]) {
    func swap(_ a: inout Elem, _ b: inout Elem) {
        let tmp = a
        a = b
        b = tmp
    }
       
    buildMaxHeap(&arr)   
   
    var size = arr.count
       
    while size > 1 {
        swap(&arr[0], &arr[size - 1])
        size = size - 1
        maxHeapify(&arr, size, 0)
    }
}

测试:

var intArray = [3, 8, 46, 38, 29, 15, 8]

print("before")

for elem in intArray {
    print("elem = \(elem)")
}

heapSort(&intArray)

print("after")

for elem in intArray {
    print("elem = \(elem)")
}

结果:

测试的环境:https://swiftlang.ng.bluemix.net/#/repl

时间: 2024-11-05 22:48:03

堆排序(Swift版本)的相关文章

窥探Swift系列博客说明及其Swift版本间更新

Swift到目前为止仍在更新,每次更新都会推陈出新,一些Swift旧版本中的东西在新Swift中并不适用,而且新版本的Swift会添加新的功能.到目前为止,Swift为2.1版本.去年翻译的Swift书籍是1.0版本,所以上面一些东西并不在适用.虽然Swift语言仍在更新,但是其整体的基础框架已经形成,大的改动应该不会有,版本的更新更多的是语言新功能的添加和完善,所以并不用担心现在学的Swift会过时.更新也就是在原有的基础上去更新,所以学学Swift还是很有必要的.新的Swift版本中引入了好

CocoaPods 更新慢&amp;swift版本适配

一.更新慢的问题 使用CocoaPods来添加第三方类库,无论是执行pod install还是pod update都卡在了Analyzing dependencies不动 原因在于当执行以上两个命令的时候会升级CocoaPods的spec仓库,加一个参数可以省略这一步,然后速度就会提升不少. 加参数的命令如下: pod install --verbose --no-repo-update pod update --verbose --no-repo-update 二.我在swift工程用Coco

升级xcode8之后出现报错提示,提示swift版本问题

最近Xcode升级了,出现了各种蛋疼的错误提示,今天遇到个导入框架出现了提示Swift版本的问题,具体如下: "Use Legacy Swift Language Version" (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax-] menu to choo

swift版本拼图游戏项目源码

现学现做的第一个swift版本拼图游戏demo 常规模式,对换模式任你选择, 用到了花瓣的API,各种萌妹子~

xcode来引用swift版本的protocolbuf

首先从git下面找源文件 地址如下 点击打开链接https://github.com/alexeyxo/protobuf-swift 当然它的第七步不太好, 7.Add ./src/ProtocolBuffers/ProtocolBuffers.xcodeproj in your project. 我选用pod来在项目中去引用protocol, 去搜索下 pod search ProtocolBuffers 然后会发现两个,一个是oc的,一个是swift的, 选择第二个swift版本,添加到po

自动布局autolayout使用总结(源码含swift版本)

一.概述 使用autolayout有一段时间了,Objective-C和swift下.iOS7和iOS8下都在用, 一路遇到了不少的坑,随遇随填,到今天也算是积累了不少经验了,这里总结一下, 通过自己新建的一个Doubi Demo来分享给大家.Doubi Demo我已上传到github上 去了(地址是:https://github.com/lihux/iLihuxAutoLayout),以后每篇文章的demo都 将放在github上,供大家参考.源码的workspace中有两个工程,分别使用OC

Swift 版本历史记录(关注)

http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapter1/03_revision_history.html 本页内容包括: XCode6.2 Beta3 Swift语法文档更新 XCode6.2 Beta2 Swift语法文档更新 XCode6.2 Beta1 Swift语法文档更新 XCode6.1.1 Swift语法文档更新 XCode6.1 Swift语法文档更新 XCode6.1 Beta2

Swift版本之大雪纷飞

今天真是闲来无事,随便看了一下苹果官方的Swift教程.其实也仅仅是看了第一章内容,记住了一点几本的语法. 然后想起昨天自己没事写的大雪纷飞的动画,自己就拿起来练一下手. 说真的做Demo的时候还真遇到几个比较棘手的问题. Swift是强类型语言,对没有隐式的数据类型的转换,也就是说,即使是 Float/Int这种运算都会报错,需要你自己转换成相同的数据类型. Swift中没有block的概念,不过Swift语言中的函数功能及其强大,可以当参数,可以当做返回值.也就是说可以用函数完全取代bloc

swift版本的快排和归并排序

class SortClass: NSObject { func quickSort(inout array:[Int]){ self.quick(&array, left: 0, right: array.count-1) } func quickMain(inout array:[Int],var left:Int,var right:Int)->Int{ var srcLeft=array[left] while(left<right){ while(left<right&