Skip to content

Commit eb0f3f6

Browse files
Merge pull request #461 from TarangKhanna/master
Ruby and Swift merge sort implementation
2 parents 4c9f3f8 + 50f02ce commit eb0f3f6

File tree

4 files changed

+132
-0
lines changed

4 files changed

+132
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
=begin
2+
This method has a big O of O(nlog2n). It uses a divide and conquer startegy.
3+
Conceptually, a merge sort works as follows:
4+
5+
Divide the unsorted list into n sublists, each containing 1 element (a list of 1 element is considered sorted).
6+
Repeatedly merge sublists to produce new sorted sublists until there is only 1 sublist remaining. This will be the sorted list.
7+
Source: https://en.wikipedia.org/?title=Merge_sort
8+
=end
9+
10+
def mergesort(array)
11+
def merge(left_sorted, right_sorted)
12+
res = []
13+
l = 0
14+
r = 0
15+
16+
loop do
17+
break if r >= right_sorted.length and l >= left_sorted.length
18+
19+
if r >= right_sorted.length or (l < left_sorted.length and left_sorted[l] < right_sorted[r])
20+
res << left_sorted[l]
21+
l += 1
22+
else
23+
res << right_sorted[r]
24+
r += 1
25+
end
26+
end
27+
28+
return res
29+
end
30+
31+
def mergesort_iter(array_sliced)
32+
return array_sliced if array_sliced.length <= 1
33+
34+
mid = array_sliced.length/2 - 1
35+
left_sorted = mergesort_iter(array_sliced[0..mid])
36+
right_sorted = mergesort_iter(array_sliced[mid+1..-1])
37+
return merge(left_sorted, right_sorted)
38+
end
39+
40+
mergesort_iter(array)
41+
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
require './merge_sort'
2+
3+
describe "#merge_sort" do
4+
it "Sort The Array" do
5+
merge_sort([5,3,6,2,4]).should eq([2,3,3,5,6])
6+
end
7+
end
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import Foundation
2+
3+
// Build 100 random numbers between 0 and 100
4+
var numbers = Int[]()
5+
for i in 1..100 {
6+
let n = Int(arc4random() % 101)
7+
numbers.append(n)
8+
}
9+
10+
func elementsInRange<T>(a: T[], start: Int, end: Int) -> (T[]) {
11+
var result = T[]()
12+
13+
for x in start..end {
14+
result.append(a[x])
15+
}
16+
17+
return result
18+
}
19+
20+
func merge<T: Comparable>(a: T[], b: T[], mergeInto acc: T[]) -> T[] {
21+
if a == [] {
22+
return acc + b
23+
} else if b == [] {
24+
return acc + a
25+
}
26+
27+
if a[0] < b[0] {
28+
return merge(elementsInRange(a, 1, a.count), b, mergeInto: acc + [a[0]])
29+
} else {
30+
return merge(a, elementsInRange(b, 1, b.count), mergeInto: acc + [b[0]])
31+
}
32+
}
33+
34+
func mergesort<T: Comparable>(a: T[]) -> T[] {
35+
if a.count <= 1 {
36+
return a
37+
} else {
38+
let firstHalf = elementsInRange(a, 0, a.count/2)
39+
let secondHalf = elementsInRange(a, a.count/2, a.count)
40+
41+
return merge(mergesort(firstHalf), mergesort(secondHalf), mergeInto: [])
42+
}
43+
}
44+
45+
let sorted = mergesort(numbers)
46+
47+
println(sorted)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//
2+
// merge_sort_test.swift
3+
//
4+
//
5+
// Created by Tarang khanna on 7/29/15.
6+
//
7+
//
8+
9+
import Foundation
10+
11+
func testBubbleSort() { // swift 1.2 compatible
12+
13+
let numberList : Array<Int> = [4, 3, 23, 2, 14, 41, 15,12]
14+
var mergeSortTest: merge_sort = merge_sort()
15+
16+
// pass the list to be sorted
17+
var resultList: Array<Int>! = mergeSortTest.mergesort(numberList)
18+
19+
// determine if the numbers are sorted
20+
var x: Int = 0
21+
for (x = 0; x < resultList.count; x++) {
22+
23+
if ((x > 0) && (resultList[x] < resultList[x - 1])) {
24+
XCTFail("numberlist items not in sorted order")
25+
}
26+
else {
27+
println("item \(resultList[x]) is sorted")
28+
}
29+
30+
31+
} // end for
32+
33+
34+
35+
} // end function
36+
37+
// supports all datatypes using generics

0 commit comments

Comments
 (0)