Day 15b: Sorting and Searching Algorithms in Go

Venkat Annangi
Venkat Annangi
26/11/2024 14:08 7 min read 46 views
#golang series #108 days of golang # go sorting # go searching
Day 15b: Sorting and Searching Algorithms in Go

Sorting and Searching Algorithms in Go

Go (Golang) provides efficient built-in and custom implementations for sorting and searching algorithms. Unlike traditional languages like Java or C++, Go takes a more straightforward approach with its sort package while maintaining high performance. In this multi-part article, we will explore Go's sorting and searching capabilities in detail.

Built-in Sorting in Go

The sort Package

Go's standard library includes the sort package, which provides basic sorting capabilities for slices and user-defined collections. Here's a basic example:

package main
import (
    "fmt"
    "sort"
)
func main() {
    // Sorting integers
    numbers := []int{5, 2, 6, 3, 1, 4}
    sort.Ints(numbers)
    fmt.Println(numbers) // Output: [1 2 3 4 5 6]
    // Sorting strings
    words := []string{"banana", "apple", "cherry"}
    sort.Strings(words)
    fmt.Println(words) // Output: [apple banana cherry]
}

Custom Sorting

Go uses interfaces for custom sorting, specifically sort.Interface. Here's an example:

package main
import (
    "fmt"
    "sort"
)
type Person struct {
    Name string
    Age  int
}
type ByAge []Person
func (a ByAge) Len() int           { return len(a) }
func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
func main() {
    people := []Person{
        {"Alice", 25},
        {"Bob", 30},
        {"Charlie", 20},
    }
    
    sort.Sort(ByAge(people))
    fmt.Println(people) // Output: [{Charlie 20} {Alice 25} {Bob 30}]
}

Advanced Sorting Techniques in Go

Parallel Sorting

Parallel sorting can be implemented using Go's concurrency features:

package main
import (
    "fmt"
)
func parallelMergeSort(arr []int) []int {
    if len(arr) <= 1 {
        return arr
    }
    mid := len(arr) / 2
    leftChan := make(chan []int)
    rightChan := make(chan []int)
    go func() { leftChan <- parallelMergeSort(arr[:mid]) }()
    go func() { rightChan <- parallelMergeSort(arr[mid:]) }()
    left, right := <-leftChan, <-rightChan
    close(leftChan)
    close(rightChan)
    return merge(left, right)
}
func merge(left, right []int) []int {
    result := make([]int, 0, len(left)+len(right))
    i, j := 0, 0
    for i < len(left) && j < len(right) {
        if left[i] <= right[j] {
            result = append(result, left[i])
            i++
        } else {
            result = append(result, right[j])
            j++
        }
    }
    result = append(result, left[i:]...)
    result = append(result, right[j:]...)
    return result
}
func main() {
    data := []int{5, 2, 6, 3, 1, 4, 8, 7}
    sorted := parallelMergeSort(data)
    fmt.Println(sorted) // Output: [1 2 3 4 5 6 7 8]
}

Sorting with Generics

With Go 1.18+, generics allow for reusable sorting functions:

package main
import (
    "fmt"
    "sort"
)
func sortSlice[T any](slice []T, less func(i, j T) bool) {
    sort.Slice(slice, func(i, j int) bool {
        return less(slice[i], slice[j])
    })
}
func main() {
    data := []int{5, 2, 6, 3, 1, 4}
    sortSlice(data, func(a, b int) bool { return a < b })
    fmt.Println(data) // Output: [1 2 3 4 5 6]
    words := []string{"banana", "apple", "cherry"}
    sortSlice(words, func(a, b string) bool { return a < b })
    fmt.Println(words) // Output: [apple banana cherry]
}

Searching Algorithms in Go

Binary Search

Binary search is implemented using the sort.Search function:

package main
import (
    "fmt"
    "sort"
)
func main() {
    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
    target := 5
    index := sort.Search(len(numbers), func(i int) bool {
        return numbers[i] >= target
    })
    if index < len(numbers) && numbers[index] == target {
        fmt.Printf("Found %d at index %d\n", target, index)
    } else {
        fmt.Printf("%d not found\n", target)
    }
}

Visualization of the search and sorting algorithms in go

Go Sorting & Searching Algorithms Visualization

Bubble Sort

 

Binary Search

 

 

Real-World Use Cases and Optimization Tips

  • Data Processing: Sorting logs or large datasets.
  • Search Optimization: Pre-sorting datasets for faster lookups.
  • UI Applications: Sorting lists for user-friendly display.

For large datasets, consider using parallel algorithms or leveraging Go's sort.Slice for concise custom sorting.

Sorting and searching are essential tools for efficient programming. By mastering Go's built-in and advanced techniques, you can tackle a wide range of real-world problems with elegance and performance.

Comments