From cbfa634e8228de6995b74de542b6037d12d05489 Mon Sep 17 00:00:00 2001 From: luke-else <52086083+luke-else@users.noreply.github.com> Date: Tue, 23 Nov 2021 23:51:37 +0000 Subject: [PATCH] Added Binary Search --- BinarySearch/go.mod | 3 ++ BinarySearch/main.go | 125 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 BinarySearch/go.mod create mode 100644 BinarySearch/main.go diff --git a/BinarySearch/go.mod b/BinarySearch/go.mod new file mode 100644 index 0000000..e938e2e --- /dev/null +++ b/BinarySearch/go.mod @@ -0,0 +1,3 @@ +module PWD + +go 1.17 diff --git a/BinarySearch/main.go b/BinarySearch/main.go new file mode 100644 index 0000000..d7fd2d3 --- /dev/null +++ b/BinarySearch/main.go @@ -0,0 +1,125 @@ +package main + +import ( + "fmt" + "math/rand" + "strconv" + "time" +) + +func main() { + //list := []int{1, 2, 3, 4, 5, 6, 7} + + //x := RecursiveBinarySearch(list, getVal(), 0, len(list)-1) + + //fmt.Println(x) + + testTimed(10000000) +} + +func RecursiveBinarySearch(list []int, value int, start int, end int) int { + var mid int = (start + end) / 2 + + if start == (end - 1) { + if list[mid] == value { + return mid + } + return -1 + } + + if value < list[mid] { + return RecursiveBinarySearch(list, value, start, mid) + } + return RecursiveBinarySearch(list, value, mid, end) + +} + +func getVal() (value int) { + + var input string + + fmt.Println("What value would you like to find in the list:") + fmt.Scan(&input) + + value, err := strconv.Atoi(input) + + if err != nil { + fmt.Println("Invalid Input") + return getVal() + } + + return +} + +func generateList(value int) (list []int) { + + for i := 1; i <= value; i++ { + list = append(list, i) + } + return +} + +func generateRandomList(value int) (list []int) { + for i := 1; i <= value; i++ { + list = append(list, rand.Intn(value)) + } + return +} + +func testTimed(value int) { + + const mult int = 1000000 + + for i := 1; i <= value; i++ { + + start := time.Now() + + list := generateRandomList(i * mult) + list = mergeSort(list, 0, len(list)-1) + + rnd := rand.Intn(i*mult) + 1 + + x := RecursiveBinarySearch(list, rnd, 0, len(list)-1) + + //fmt.Println(time.Now().Sub(start), x, i*1000, "items") + fmt.Println("found number ", rnd, ":", x, " in a list of ", len(list), " items in ", time.Since(start)) + } +} + +func mergeSort(nums []int, start int, end int) []int { + if start == end { + return []int{nums[start]} + } + + var mid int = ((end - start) / 2) + start + + //Assign values back into Left and right + left := mergeSort(nums, start, mid) + right := mergeSort(nums, mid+1, end) + + var combined []int + + //Pointers for new array + leftPointer, rightPointer := 0, 0 + + for leftPointer <= len(left)-1 || rightPointer <= len(right)-1 { + + if leftPointer == len(left) { + addValue(&combined, right[rightPointer], &rightPointer) + } else if rightPointer == len(right) { + addValue(&combined, left[leftPointer], &leftPointer) + } else { + if left[leftPointer] <= right[rightPointer] { + addValue(&combined, left[leftPointer], &leftPointer) + } else { + addValue(&combined, right[rightPointer], &rightPointer) + } + } + } + return combined +} + +func addValue(nums *[]int, value int, pointer *int) { + *nums = append(*nums, value) + *pointer++ +}