欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go語言實現十大常見的排序算法示例

 更新時間:2023年08月28日 10:07:26   作者:暗夜辰星  
這篇文章主要為大家介紹了go語言實現十大常見的排序算法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

十大常見的排序算法(go語言實現)

冒泡排序(Bubble Sort)

選擇排序(Selection Sort)

插入排序(Insertion Sort)

希爾排序(Shell Sort)

歸并排序(Merge Sort)

快速排序(Quick Sort)

堆排序(Heap Sort)

計數排序(Counting Sort)

桶排序(Bucket Sort)

基數排序(Radix Sort)

go語言實現

package main
import "fmt"
// 冒泡排序
func BubbleSort(arr []int) {
    n := len(arr)
    for i := 0; i < n-1; i++ {
        for j := 0; j < n-i-1; j++ {
            if arr[j] > arr[j+1] {
                arr[j], arr[j+1] = arr[j+1], arr[j]
            }
        }
    }
}
// 選擇排序
func SelectionSort(arr []int) {
    n := len(arr)
    for i := 0; i < n-1; i++ {
        minIndex := i
        for j := i + 1; j < n; j++ {
            if arr[j] < arr[minIndex] {
                minIndex = j
            }
        }
        arr[i], arr[minIndex] = arr[minIndex], arr[i]
    }
}
// 插入排序
func InsertionSort(arr []int) {
    n := len(arr)
    for i := 1; i < n; i++ {
        key := arr[i]
        j := i - 1
        for j >= 0 && arr[j] > key {
            arr[j+1] = arr[j]
            j--
        }
        arr[j+1] = key
    }
}
// 希爾排序
func ShellSort(arr []int) {
    n := len(arr)
    gap := n / 2
    for gap > 0 {
        for i := gap; i < n; i++ {
            j := i
            for j-gap >= 0 && arr[j-gap] > arr[j] {
                arr[j-gap], arr[j] = arr[j], arr[j-gap]
                j -= gap
            }
        }
        gap /= 2
    }
}
// 歸并排序
func MergeSort(arr []int) []int {
    if len(arr) <= 1 {
        return arr
    }
    mid := len(arr) / 2
    left := MergeSort(arr[:mid])
    right := MergeSort(arr[mid:])
    return merge(left, right)
}
func merge(left, right []int) []int {
    result := make([]int, 0)
    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 QuickSort(arr []int) {
    quickSort(arr, 0, len(arr)-1)
}
func quickSort(arr []int, left, right int) {
    if left < right {
        pivot := partition(arr, left, right)
        quickSort(arr, left, pivot-1)
        quickSort(arr, pivot+1, right)
    }
}
func partition(arr []int, left, right int) int {
    pivot := arr[right]
    i := left - 1
    for j := left; j < right; j++ {
        if arr[j] < pivot {
            i++
            arr[i], arr[j] = arr[j], arr[i]
        }
    }
    arr[i+1], arr[right] = arr[right], arr[i+1]
    return i + 1
}
// 堆排序
func HeapSort(arr []int) {
    n := len(arr)
    for i := n/2 - 1; i >= 0; i-- {
        heapify(arr, n, i)
    }
    for i := n - 1; i >= 0; i-- {
        arr[0], arr[i] = arr[i], arr[0]
        heapify(arr, i, 0)
    }
}
func heapify(arr []int, n, i int) {
    largest := i
    left := 2*i + 1
    right := 2*i + 2
    if left < n && arr[left] > arr[largest] {
        largest = left
    }
    if right < n && arr[right] > arr[largest] {
        largest = right
    }
    if largest != i {
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)
    }
}
// 計數排序
func CountingSort(arr []int) {
    n := len(arr)
    if n <= 1 {
        return
    }
    maxVal := arr[0]
    for i := 1; i < n; i++ {
        if arr[i] > maxVal {
            maxVal = arr[i]
        }
    }
    count := make([]int, maxVal+1)
    for i := 0; i < n; i++ {
        count[arr[i]]++
    }
    for i, j := 0, 0; i <= maxVal; i++ {
        for count[i] > 0 {
            arr[j] = i
            j++
            count[i]--
        }
    }
}
// 桶排序
func BucketSort(arr []int) {
    n := len(arr)
    if n <= 1 {
        return
    }
    maxVal := arr[0]
    minVal := arr[0]
    for i := 1; i < n; i++ {
        if arr[i] > maxVal {
            maxVal = arr[i]
        }
        if arr[i] < minVal {
            minVal = arr[i]
        }
    }
    bucketSize := 10
    bucketCount := (maxVal-minVal)/bucketSize + 1
    buckets := make([][]int, bucketCount)
    for i := 0; i < bucketCount; i++ {
        buckets[i] = make([]int, 0)
    }
    for i := 0; i < n; i++ {
        index := (arr[i] - minVal) / bucketSize
        buckets[index] = append(buckets[index], arr[i])
    }
    k := 0
    for i := 0; i < bucketCount; i++ {
        if len(buckets[i]) > 0 {
            InsertionSort(buckets[i])
            copy(arr[k:], buckets[i])
            k += len(buckets[i])
        }
    }
}
// 基數排序
func RadixSort(arr []int) {
    n := len(arr)
    if n <= 1 {
        return
    }
    maxVal := arr[0]
    for i := 1; i < n; i++ {
        if arr[i] > maxVal {
            maxVal = arr[i]
        }
    }
    exp := 1
    for maxVal/exp > 0 {
        countingSortForRadix(arr, exp)
        exp *= 10
    }
}
func countingSortForRadix(arr []int, exp int) {
    n := len(arr)
    count := make([]int, 10)
    output := make([]int, n)
    for i := 0; i < n; i++ {
        index := (arr[i] / exp) % 10
        count[index]++
    }
    for i := 1; i < 10; i++ {
        count[i] += count[i-1]
    }
    for i := n - 1; i >= 0; i-- {
        index := (arr[i] / exp) % 10
        output[count[index]-1] = arr[i]
        count[index]--
    }
    for i := 0; i < n; i++ {
        arr[i] = output[i]
    }
}
func main() {
    arr1 := []int{1, 3, 2, 5, 4, 7, 6, 9, 8}
    arr2 := []int{1, 3, 2, 5, 4, 7, 6, 9, 8}
    arr3 := []int{1, 3, 2, 5, 4, 7, 6, 9, 8}
    arr4 := []int{1, 3, 2, 5, 4, 7, 6, 9, 8}
    arr5 := []int{1, 3, 2, 5, 4, 7, 6, 9, 8}
    arr6 := []int{1, 3, 2, 5, 4, 7, 6, 9, 8}
    arr7 := []int{1, 3, 2, 5, 4, 7, 6, 9, 8}
    arr8 := []int{1, 3, 2, 5, 4, 7, 6, 9, 8}
    arr9 := []int{1, 3, 2, 5, 4, 7, 6, 9, 8}
    arr10 := []int{1, 3, 2, 5, 4, 7, 6, 9, 8}
    BubbleSort(arr1)
    fmt.Printf("arr1: %v\n", arr1)
    SelectionSort(arr2)
    fmt.Printf("arr2: %v\n", arr2)
    InsertionSort(arr3)
    fmt.Printf("arr3: %v\n", arr3)
    ShellSort(arr4)
    fmt.Printf("arr4: %v\n", arr4)
    arr5 = MergeSort(arr5)
    fmt.Printf("arr5: %v\n", arr5)
    QuickSort(arr6)
    fmt.Printf("arr6: %v\n", arr6)
    HeapSort(arr7)
    fmt.Printf("arr7: %v\n", arr7)
    CountingSort(arr8)
    fmt.Printf("arr8: %v\n", arr8)
    BucketSort(arr9)
    fmt.Printf("arr9: %v\n", arr9)
    RadixSort(arr10)
    fmt.Printf("arr10: %v\n", arr10)
}

輸出的結果:

$ go run main.go
arr1: [1 2 3 4 5 6 7 8 9]
arr2: [1 2 3 4 5 6 7 8 9]
arr3: [1 2 3 4 5 6 7 8 9]
arr4: [1 2 3 4 5 6 7 8 9]
arr5: [1 2 3 4 5 6 7 8 9]
arr6: [1 2 3 4 5 6 7 8 9]
arr7: [1 2 3 4 5 6 7 8 9]
arr8: [1 2 3 4 5 6 7 8 9]
arr9: [1 2 3 4 5 6 7 8 9]
arr10: [1 2 3 4 5 6 7 8 9]

排序算法的原理、執(zhí)行過程、復雜度和耗時的簡要說明

冒泡排序:比較相鄰的元素,如果前一個比后一個大,則交換它們的位置。重復這個過程,直到整個序列有序。
時間復雜度為O(n^2),空間復雜度為O(1)。在最壞情況下,需要進行n(n-1)/2次比較和交換操作。

選擇排序:每次從未排序的序列中選擇最小的元素,將其放到已排序序列的末尾。
時間復雜度為O(n^2),空間復雜度為O(1)。在最壞情況下,需要進行n(n-1)/2次比較和n-1次交換操作。

插入排序:將一個元素插入到已排序序列的合適位置,使得插入后的序列仍然有序。
時間復雜度為O(n^2),空間復雜度為O(1)。在最壞情況下,需要進行n(n-1)/2次比較和n(n-1)/2次移動操作。

希爾排序:將序列分成若干個子序列,對每個子序列進行插入排序,然后逐步縮小子序列的長度,最終對整個序列進行插入排序。
時間復雜度為O(nlogn)~O(n^2),空間復雜度為O(1)。

歸并排序:將序列分成若干個子序列,對每個子序列進行排序,然后將排好序的子序列合并成一個有序序列。時間復雜度為O(nlogn),空間復雜度為O(n)。

快速排序:選擇一個基準元素,將序列分成兩個子序列,小于基準元素的放在左邊,大于基準元素的放在右邊,然后遞歸地對左右子序列進行快速排序。
時間復雜度為O(nlogn),空間復雜度為O(logn)~O(n)。

堆排序:將序列構建成一個堆,然后依次取出堆頂元素,將其放到已排序序列的末尾。
時間復雜度為O(nlogn),空間復雜度為O(1)。

計數排序:統(tǒng)計序列中每個元素出現的次數,然后根據元素出現的次數將序列重構。
時間復雜度為O(n+k),空間復雜度為O(k),其中k為序列中元素的取值范圍。

桶排序:將序列分成若干個桶,對每個桶進行排序,然后將所有桶中的元素按照順序依次放到一起。
時間復雜度為O(n),空間復雜度為O(n)。

基數排序:將序列按照位數進行排序,從低位到高位依次進行排序。
時間復雜度為O(d(n+r)),空間復雜度為O(n+r),其中d為最大數的位數,r為基數。

以上就是go語言實現十大常見的排序算法示例的詳細內容,更多關于go語言排序算法的資料請關注腳本之家其它相關文章!

相關文章

  • 詳解Go語言中的逃逸分析

    詳解Go語言中的逃逸分析

    逃逸分析是編譯器用于決定將變量分配到棧上還是堆上的一種行為,下面小編就來為大家詳細講講go語言中是如何進行逃逸分析的,需要的小伙伴可以參考下
    2023-09-09
  • Golang中漏洞數據庫的使用詳解

    Golang中漏洞數據庫的使用詳解

    govulncheck是Golang中的漏洞掃描工具,它強大功能的背后,離不開?Go?漏洞數據庫(Go?vulnerability?database)的支持,所以本文就來為大家詳細講解下?Go?漏洞數據庫相關的知識
    2023-09-09
  • 一文帶你了解Go語言標準庫math和rand的常用函數

    一文帶你了解Go語言標準庫math和rand的常用函數

    這篇文章主要為大家詳細介紹了Go語言標準庫math和rand中的常用函數,文中的示例代碼講解詳細, 對我們學習Go語言有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12
  • GO中的時間操作總結(time&dateparse)

    GO中的時間操作總結(time&dateparse)

    日常開發(fā)過程中,對于時間的操作可謂是無處不在,但是想實現時間自由還是不簡單的,多種時間格式容易混淆,本文為大家整理了一下GO中的時間操作,有需要的可以參考下
    2023-09-09
  • Golang?中實現?Set的思路詳解

    Golang?中實現?Set的思路詳解

    本文介紹了Go中兩種set的實現原理,并在此基礎介紹了對應于它們的兩個包簡單使用,本文介紹的非常詳細,需要的朋友參考下吧
    2024-01-01
  • Go語言驅動低代碼應用引擎工具Yao開發(fā)管理系統(tǒng)

    Go語言驅動低代碼應用引擎工具Yao開發(fā)管理系統(tǒng)

    這篇文章主要為大家介紹了Go語言驅動低代碼應用引擎工具Yao開發(fā)管理系統(tǒng)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • golang使用正則表達式解析網頁

    golang使用正則表達式解析網頁

    這篇文章主要介紹了golang使用正則表達式解析網頁,需要的朋友可以參考下
    2015-03-03
  • Go語言基于viper的conf庫進行配置文件解析

    Go語言基于viper的conf庫進行配置文件解析

    在現代軟件開發(fā)中,配置文件是不可或缺的一部分,如何高效地將這些格式解析到 Go 結構體中,一直是開發(fā)者的痛點,下面我們來看看如何使用conf進行配置文件解析吧
    2025-03-03
  • 協(xié)同開發(fā)巧用gitignore中間件避免網絡請求攜帶登錄信息

    協(xié)同開發(fā)巧用gitignore中間件避免網絡請求攜帶登錄信息

    這篇文章主要為大家介紹了協(xié)同開發(fā)巧用gitignore中間件避免網絡請求攜帶登錄信息
    2022-06-06
  • Golang匯編之控制流深入分析講解

    Golang匯編之控制流深入分析講解

    這篇文章主要介紹了Golang匯編之控制流,程序執(zhí)行的流程主要有順序、分支和循環(huán)幾種執(zhí)行流程,本節(jié)主要討論如何將Go語言的控制流比較直觀地轉譯為匯編程序,或者說如何以匯編思維來編寫Go語言代碼,感興趣的同學可以參考下文
    2023-05-05

最新評論