go語言實現(xiàn)十大常見的排序算法示例
十大常見的排序算法(go語言實現(xiàn))
冒泡排序(Bubble Sort)
選擇排序(Selection Sort)
插入排序(Insertion Sort)
希爾排序(Shell Sort)
歸并排序(Merge Sort)
快速排序(Quick Sort)
堆排序(Heap Sort)
計數(shù)排序(Counting Sort)
桶排序(Bucket Sort)
基數(shù)排序(Radix Sort)
go語言實現(xiàn)
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)
}
}
// 計數(shù)排序
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])
}
}
}
// 基數(shù)排序
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)
}輸出的結(jié)果:
$ 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í)行過程、復(fù)雜度和耗時的簡要說明
冒泡排序:比較相鄰的元素,如果前一個比后一個大,則交換它們的位置。重復(fù)這個過程,直到整個序列有序。
時間復(fù)雜度為O(n^2),空間復(fù)雜度為O(1)。在最壞情況下,需要進(jìn)行n(n-1)/2次比較和交換操作。
選擇排序:每次從未排序的序列中選擇最小的元素,將其放到已排序序列的末尾。
時間復(fù)雜度為O(n^2),空間復(fù)雜度為O(1)。在最壞情況下,需要進(jìn)行n(n-1)/2次比較和n-1次交換操作。
插入排序:將一個元素插入到已排序序列的合適位置,使得插入后的序列仍然有序。
時間復(fù)雜度為O(n^2),空間復(fù)雜度為O(1)。在最壞情況下,需要進(jìn)行n(n-1)/2次比較和n(n-1)/2次移動操作。
希爾排序:將序列分成若干個子序列,對每個子序列進(jìn)行插入排序,然后逐步縮小子序列的長度,最終對整個序列進(jìn)行插入排序。
時間復(fù)雜度為O(nlogn)~O(n^2),空間復(fù)雜度為O(1)。
歸并排序:將序列分成若干個子序列,對每個子序列進(jìn)行排序,然后將排好序的子序列合并成一個有序序列。時間復(fù)雜度為O(nlogn),空間復(fù)雜度為O(n)。
快速排序:選擇一個基準(zhǔn)元素,將序列分成兩個子序列,小于基準(zhǔn)元素的放在左邊,大于基準(zhǔn)元素的放在右邊,然后遞歸地對左右子序列進(jìn)行快速排序。
時間復(fù)雜度為O(nlogn),空間復(fù)雜度為O(logn)~O(n)。
堆排序:將序列構(gòu)建成一個堆,然后依次取出堆頂元素,將其放到已排序序列的末尾。
時間復(fù)雜度為O(nlogn),空間復(fù)雜度為O(1)。
計數(shù)排序:統(tǒng)計序列中每個元素出現(xiàn)的次數(shù),然后根據(jù)元素出現(xiàn)的次數(shù)將序列重構(gòu)。
時間復(fù)雜度為O(n+k),空間復(fù)雜度為O(k),其中k為序列中元素的取值范圍。
桶排序:將序列分成若干個桶,對每個桶進(jìn)行排序,然后將所有桶中的元素按照順序依次放到一起。
時間復(fù)雜度為O(n),空間復(fù)雜度為O(n)。
基數(shù)排序:將序列按照位數(shù)進(jìn)行排序,從低位到高位依次進(jìn)行排序。
時間復(fù)雜度為O(d(n+r)),空間復(fù)雜度為O(n+r),其中d為最大數(shù)的位數(shù),r為基數(shù)。
以上就是go語言實現(xiàn)十大常見的排序算法示例的詳細(xì)內(nèi)容,更多關(guān)于go語言排序算法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
一文帶你了解Go語言標(biāo)準(zhǔn)庫math和rand的常用函數(shù)
這篇文章主要為大家詳細(xì)介紹了Go語言標(biāo)準(zhǔn)庫math和rand中的常用函數(shù),文中的示例代碼講解詳細(xì), 對我們學(xué)習(xí)Go語言有一定的幫助,感興趣的小伙伴可以了解一下2022-12-12
GO中的時間操作總結(jié)(time&dateparse)
日常開發(fā)過程中,對于時間的操作可謂是無處不在,但是想實現(xiàn)時間自由還是不簡單的,多種時間格式容易混淆,本文為大家整理了一下GO中的時間操作,有需要的可以參考下2023-09-09
Go語言驅(qū)動低代碼應(yīng)用引擎工具Yao開發(fā)管理系統(tǒng)
這篇文章主要為大家介紹了Go語言驅(qū)動低代碼應(yīng)用引擎工具Yao開發(fā)管理系統(tǒng)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Go語言基于viper的conf庫進(jìn)行配置文件解析
在現(xiàn)代軟件開發(fā)中,配置文件是不可或缺的一部分,如何高效地將這些格式解析到 Go 結(jié)構(gòu)體中,一直是開發(fā)者的痛點,下面我們來看看如何使用conf進(jìn)行配置文件解析吧2025-03-03
協(xié)同開發(fā)巧用gitignore中間件避免網(wǎng)絡(luò)請求攜帶登錄信息
這篇文章主要為大家介紹了協(xié)同開發(fā)巧用gitignore中間件避免網(wǎng)絡(luò)請求攜帶登錄信息2022-06-06

