Skip to content

Instantly share code, notes, and snippets.

@shooley
Last active August 29, 2015 14:10
Show Gist options
  • Save shooley/06af824ce8da9d71bbfc to your computer and use it in GitHub Desktop.
Save shooley/06af824ce8da9d71bbfc to your computer and use it in GitHub Desktop.
Mergesort in Swift
let numbers = [9,29, 83, 19, 48, 65, 25, 30, 18, 1, 15, 84, 72, 63, 71]
func splitToSublists(list: [Int]) -> ([Int], [Int]) {
assert(list.count > 1, "List size must be greater than 1 before split")
let midIndex = (list.count / 2) as Int
if(list.count == 2) {
var leftSublist = Array([list[0]])
var rightSublist = Array([list[1]])
return (leftSublist, rightSublist)
}
else {
var leftSublist: [Int] = Array(list[0...midIndex])
var rightSublist: [Int] = Array(list[midIndex+1...list.count - 1])
return (leftSublist, rightSublist)
}
}
func merge(left: [Int], right: [Int]) -> [Int] {
var result: [Int] = [Int]()
var list1 = left
var list2 = right
println(list1)
while(list1.count > 0 || list2.count > 0)
{
if(list1.count > 0 && list2.count > 0) {
if list1[0] <= list2[0] {
result.append(list1[0])
list1 = rest(list1)
}
else
{
result.append(list2[0])
list2 = rest(list2)
}
}
else if list1.count > 0 {
result.append(list1[0])
list1 = rest(list1)
}
else {
result.append(list2[0])
list2 = rest(list2)
}
}
return result
}
func rest(list: [Int]) -> [Int] {
var newList: [Int] = [Int]()
if(list.count > 1) {
newList = Array(list[1...list.count-1])
}
return newList;
}
func myMergeSort(list: [Int]) -> [Int] {
if list.count > 1 {
var (leftSublist, rightSublist) = splitToSublists(list)
leftSublist = myMergeSort(leftSublist)
rightSublist = myMergeSort(rightSublist)
return merge(leftSublist, rightSublist)
}
else
{
return list
}
}
var sorted = myMergeSort(numbers)
println("sorted")
println(sorted)
// prints "[1, 9, 15, 18, 19, 25, 29, 30, 48, 63, 65, 71, 72, 83, 84]"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment