cubegao

Swift.堆排序

2015-05-14

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import Foundation

class HeapSortSolution {
func sort(_ n: [Int]) -> [Int] {

var s = n

//1.初始化堆
var i = n.count/2 - 1
while i >= 0 {
heapAdjust(&s, i, n.count - 1)
i -= 1
}

var j = n.count - 1
var l = 0
while j > 0 {
//交换首尾节点
let temp = s[j]
s[j] = s[0]
s[0] = temp

//再调整
heapAdjust(&s, 0, n.count - 1 - l )
j -= 1
l += 1
}

return s
}

func heapAdjust(_ s: inout [Int],_ local: Int,_ len: Int) {

var loc = local
var child = 2*loc + 1
while child < len {
if child + 1 < len && s[child] < s[child+1] {
child += 1
}

if s[loc] < s[child] {
let temp = s[loc]
s[loc] = s[child]
s[child] = temp
loc = child
child = 2*loc + 1
}else {
break
}
}
}
}

算法思想:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。

github地址:https://github.com/cubegao/LeetCode

Tags: 算法

扫描二维码,分享此文章