Skip to content

Instantly share code, notes, and snippets.

@patterns
Created October 5, 2016 10:53
Show Gist options
  • Save patterns/8ddf6858effb04c87fdcd6dcda3da212 to your computer and use it in GitHub Desktop.
Save patterns/8ddf6858effb04c87fdcd6dcda3da212 to your computer and use it in GitHub Desktop.
Merge sort recursive
package main
import (
"fmt"
"bufio"
"os"
)
//see Cracking Code Interview
//practice merge sort (recursive; next try iterative...)
//input is n items on line 1, then space separated values on line 2
func main() {
var n int;
var v int;
scanner := bufio.NewReader(os.Stdin)
_, err := fmt.Fscanf(scanner, "%d\n", &n)
if err != nil {
panic(err.Error())
}
a := make([]int, n)
tmp := make([]int, n)
for i :=0; i <n-1; i++ {
_, err = fmt.Fscanf(scanner, "%d ", &v)
a[i] = v
}
_, err = fmt.Fscanf(scanner, "%d\n", &v)
a[n-1] = v
mergesort(a, tmp, 0, n-1)
fmt.Printf("%v\n", a)
}
func mergesort(a []int, tmp []int, leftStart int, rightEnd int) {
if leftStart >= rightEnd {
return
}
mid := leftStart + (rightEnd-leftStart)/2
mergesort(a, tmp, leftStart, mid)
mergesort(a, tmp, mid+1, rightEnd)
mergeHalves(a, tmp, leftStart, rightEnd)
}
func mergeHalves(a []int, tmp []int, leftStart int, rightEnd int) {
leftEnd := leftStart + (rightEnd-leftStart)/2
left := leftStart
right := leftEnd +1
i := leftStart
for ; left <= leftEnd && right <= rightEnd; {
if a[left] <= a[right] {
tmp[i] = a[left]
left++
} else {
tmp[i] = a[right]
right++
}
i++
}
//copy remainder from left (either lt or rt and not both, notice the start index of destination)
//// copy(tmp[i:], a[left:(leftEnd-left +1)])
h := i
for j := left; j <= leftEnd; j++ {
tmp[h] = a[j]
h++
}
//copy remainder from right (either lt or rt and not both, notice the start index of destination)
//// copy(tmp[i:], a[right:(rightEnd-right +1)])
h = i
for j := right; j <= rightEnd; j++ {
tmp[h] = a[j]
h++
}
//copy tmp over arr
//// copy(a[leftStart:], tmp[leftStart:size])
for j := leftStart; j <= rightEnd; j++ {
a[j] = tmp[j]
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment