Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 30e967d

Browse files
Added data structure playground
1 parent 6e0eae2 commit 30e967d

File tree

3 files changed

+223
-0
lines changed

3 files changed

+223
-0
lines changed
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
import Foundation
2+
3+
//struct MinHeap {
4+
// var items: [Int] = []
5+
//
6+
// //Get Index
7+
// private func getLeftChildIndex(_ parentIndex: Int) -> Int {
8+
// return 2 * parentIndex + 1
9+
// }
10+
// private func getRightChildIndex(_ parentIndex: Int) -> Int {
11+
// return 2 * parentIndex + 2
12+
// }
13+
// private func getParentIndex(_ childIndex: Int) -> Int {
14+
// return (childIndex - 1) / 2
15+
// }
16+
//
17+
// // Boolean Check
18+
// private func hasLeftChild(_ index: Int) -> Bool {
19+
// return getLeftChildIndex(index) < items.count
20+
// }
21+
// private func hasRightChild(_ index: Int) -> Bool {
22+
// return getRightChildIndex(index) < items.count
23+
// }
24+
// private func hasParent(_ index: Int) -> Bool {
25+
// return getParentIndex(index) >= 0
26+
// }
27+
//
28+
// // Return Item From Heap
29+
// private func leftChild(_ index: Int) -> Int {
30+
// return items[getLeftChildIndex(index)]
31+
// }
32+
// private func rightChild(_ index: Int) -> Int {
33+
// return items[getRightChildIndex(index)]
34+
// }
35+
// private func parent(_ index: Int) -> Int {
36+
// return items[getParentIndex(index)]
37+
// }
38+
//
39+
// // Heap Operations
40+
// mutating private func swap(indexOne: Int, indexTwo: Int) {
41+
// let placeholder = items[indexOne]
42+
// items[indexOne] = items[indexTwo]
43+
// items[indexTwo] = placeholder
44+
// }
45+
//
46+
// public func peek() -> Int {
47+
// if items.count != 0 {
48+
// return items[0]
49+
// } else {
50+
// fatalError()
51+
// }
52+
// }
53+
//
54+
// mutating public func poll() -> Int {
55+
// if items.count != 0 {
56+
// let item = items[0]
57+
// items[0] = items[items.count - 1]
58+
// heapifyDown()
59+
// items.removeLast()
60+
// return item
61+
// } else {
62+
// fatalError()
63+
// }
64+
// }
65+
//
66+
// mutating public func add(_ item: Int) {
67+
// items.append(item)
68+
// heapifyUp()
69+
// }
70+
//
71+
// mutating private func heapifyUp() {
72+
// var index = items.count - 1
73+
// while hasParent(index) && parent(index) > items[index] {
74+
// swap(indexOne: getParentIndex(index), indexTwo: index)
75+
// index = getParentIndex(index)
76+
// }
77+
// }
78+
//
79+
// mutating private func heapifyDown() {
80+
// var index = 0
81+
// while hasLeftChild(index) {
82+
// var smallerChildIndex = getLeftChildIndex(index)
83+
// if hasRightChild(index) && rightChild(index) < leftChild(index) {
84+
// smallerChildIndex = getRightChildIndex(index)
85+
// }
86+
//
87+
// if items[index] < items[smallerChildIndex] {
88+
// break
89+
// } else {
90+
// swap(indexOne: index, indexTwo: smallerChildIndex)
91+
// }
92+
// index = smallerChildIndex
93+
// }
94+
// }
95+
//}
96+
97+
struct MaxHeap<Element: Comparable> {
98+
var items: [Element] = []
99+
100+
public mutating func add(_ item: Element) {
101+
items.append(item)
102+
heapifyUp()
103+
}
104+
105+
public mutating func poll() -> Element? {
106+
if isEmpty() {return nil}
107+
let result = items.first!
108+
items[0] = items.last!
109+
heapifyDown()
110+
items.removeLast()
111+
112+
return result
113+
}
114+
115+
public func peek() -> Element? {
116+
if isEmpty() {return nil}
117+
return items.first!
118+
}
119+
120+
public func isEmpty() -> Bool {
121+
return items.count == 0
122+
}
123+
124+
private mutating func heapifyUp() {
125+
if isEmpty() {return}
126+
127+
var index = items.count - 1
128+
while hasParent(index) && items[index] > items[parentIndex(index)] {
129+
swap(index, parentIndex(index))
130+
index = parentIndex(index)
131+
}
132+
}
133+
134+
private mutating func heapifyDown() {
135+
if isEmpty() {return}
136+
137+
var index = 0
138+
while hasLeftChild(index) {
139+
if hasRightChild(index) {
140+
if leftChild(index) > rightChild(index) {
141+
swap(index, leftChildIndex(index))
142+
index = leftChildIndex(index)
143+
continue
144+
} else {
145+
swap(index, rightChildIndex(index))
146+
index = rightChildIndex(index)
147+
continue
148+
}
149+
}
150+
swap(index, leftChildIndex(index))
151+
index = leftChildIndex(index)
152+
}
153+
}
154+
155+
private func leftChild(_ index: Int) -> Element {
156+
return items[leftChildIndex(index)]
157+
}
158+
159+
private func rightChild(_ index: Int) -> Element {
160+
return items[rightChildIndex(index)]
161+
}
162+
163+
private func parent(_ index: Int) -> Element {
164+
return items[parentIndex(index)]
165+
}
166+
167+
private func leftChildIndex(_ index: Int) -> Int {
168+
return 2 * index + 1
169+
}
170+
171+
private func rightChildIndex(_ index: Int) -> Int {
172+
return 2 * index + 2
173+
}
174+
175+
private func parentIndex(_ index: Int) -> Int {
176+
return (index - 1) / 2
177+
}
178+
179+
private func hasLeftChild(_ index: Int) -> Bool {
180+
return leftChildIndex(index) < items.count
181+
}
182+
183+
private func hasRightChild(_ index: Int) -> Bool {
184+
return rightChildIndex(index) < items.count
185+
}
186+
187+
private func hasParent(_ index: Int) -> Bool {
188+
return parentIndex(index) >= 0
189+
}
190+
191+
private mutating func swap(_ indexOfFirst: Int, _ indexOfSecond: Int) {
192+
let temp = items[indexOfFirst]
193+
items[indexOfFirst] = items[indexOfSecond]
194+
items[indexOfSecond] = temp
195+
}
196+
}
197+
198+
var array = Array(0...10)
199+
var randomArray = array.shuffled()
200+
print(randomArray)
201+
202+
var heap = MaxHeap<Int>()
203+
for i in randomArray {
204+
heap.add(i)
205+
}
206+
207+
var result: [Int] = []
208+
while heap.items.count != 0 {
209+
result.append(heap.poll()!)
210+
}
211+
212+
print(result)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+
<playground version='5.0' target-platform='ios' buildActiveScheme='true'>
3+
<timeline fileName='timeline.xctimeline'/>
4+
</playground>

‎0. Data Structures.playground/playground.xcworkspace/contents.xcworkspacedata

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /