Added Binary Search
This commit is contained in:
		
							
								
								
									
										3
									
								
								BinarySearch/go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								BinarySearch/go.mod
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
module PWD
 | 
			
		||||
 | 
			
		||||
go 1.17
 | 
			
		||||
							
								
								
									
										125
									
								
								BinarySearch/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								BinarySearch/main.go
									
									
									
									
									
										Normal file
									
								
							@@ -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++
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user