merge sort
This commit is contained in:
2 files changed
+64
No files matched your search
@@ -0,0 +1,61 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
var inputData []int = []int{5, 6, 1, 15, 80, 89, 12, 20, 10, 28}
|
||||
|
||||
func mergeSort(array []int) []int {
|
||||
if len(array) > 1 {
|
||||
fmt.Printf("splitting %x ", array)
|
||||
var halfArray int = int(len(array) / 2)
|
||||
left := array[:halfArray]
|
||||
right := array[halfArray:]
|
||||
fmt.Printf("to %x %x, halfArray=%x\n", left, right, halfArray)
|
||||
left = mergeSort(left)
|
||||
right = mergeSort(right)
|
||||
fmt.Printf("merging %x and %x { ", left, right)
|
||||
|
||||
out := make([]int, 0, len(left)+len(right))
|
||||
|
||||
lp, rp := 0, 0
|
||||
|
||||
for lp < len(left) && rp < len(right) {
|
||||
fmt.Printf("comparing left[%x]=%x and right[%x]=%x, ", lp, left[lp], rp, right[rp])
|
||||
if left[lp] == right[rp] {
|
||||
out = append(out, right[rp])
|
||||
out = append(out, left[lp])
|
||||
lp++
|
||||
rp++
|
||||
} else if left[lp] > right[rp] {
|
||||
out = append(out, right[rp])
|
||||
rp++
|
||||
} else {
|
||||
out = append(out, left[lp])
|
||||
lp++
|
||||
}
|
||||
}
|
||||
|
||||
for lp < len(left) {
|
||||
fmt.Printf("%x remaining in left, ", lp)
|
||||
out = append(out, left[lp])
|
||||
lp++
|
||||
}
|
||||
|
||||
for rp < len(right) {
|
||||
fmt.Printf("%x remaining in right, ", rp)
|
||||
out = append(out, right[rp])
|
||||
rp++
|
||||
}
|
||||
fmt.Printf("} to %x\n", out)
|
||||
return out
|
||||
} else {
|
||||
return array
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
fmt.Printf("sorting %x \n", inputData)
|
||||
fmt.Printf("sorted %x\n", mergeSort(inputData))
|
||||
}
|
||||
Reference in new issue
Block a user