golang实现基本排序算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
package main
 
import (
    "fmt"
)
 
func main() {
    arr := []int{10, 9, 5, 7, 3, 5, 2, 9, 4, 6, 10}
 
    //res := SelectionSort(arr)// 选择排序
    //res := InsertionSort(arr) // 插入排序
    //res := InsertionSortPro(arr) // 插入排序优化版
    //res := BubbleSort(arr) // 冒泡排序
    //res := MergeSort(arr) // 归并排序
    //res := QuickSort(arr) // 快速排序
    fmt.Print(res)
}
 
//选择排序
//思路:每次循环找出最小的数,跟数组第一个数交换顺序,接下来在剩余的数里重复以上逻辑
func SelectionSort(arr [11]int) [11]int {
    length := len(arr)
    for i := 0; i < length; i++ {
        min := i
        for j := i + 1; j < length; j++ {
            //只要找到比要比较的值小的值,就更新min的位置,循环一圈就能找到最小的值的位置
            if arr[j] < arr[min] {
                min = j
            }
        }
        //交换最小值与这一次循环最左边值的位置
        arr[i], arr[min] = arr[min], arr[i]
    }
    return arr
}
 
//插入排序,类似扑克牌起牌,将未排序的数据插入到已排序的数据中
func InsertionSort(arr [11]int) [11]int {
    length := len(arr)
    for i := 1; i < length; i++ {
        for j := i; j > 0; j-- {
            //如果要比较的数据小于左边的数据,则交换位置
            if arr[j-1] > arr[j] {
                arr[j], arr[j-1] = arr[j-1], arr[j]
            } else {
                break
            }
        }
    }
    return arr
}
 
//插入排序优化版,用赋值代替交换操作
func InsertionSortPro(arr [11]int) [11]int {
    length := len(arr)
    for i := 1; i < length; i++ {
        temp := arr[i] //复制一份待比较的值
        var j int
        for j = i; j > 0; j-- {
            //如果左边数据大于待比较待值,则将左边数据赋值给右边的(往右挪一位),否则停止比较
            if arr[j-1] > temp {
                arr[j] = arr[j-1]
            } else {
                break
            }
        }
        arr[j] = temp //找到合适的位置了(左边不再比该值大),将刚刚待比较的值赋值给这个元素
    }
    return arr
}
 
//冒泡排序,每次和相邻的元素比较,内层每循环一次会把最大的循环到最后
func BubbleSort(arr [11]int) [11]int {
    length := len(arr)
    for i := 0; i < length; i++ {
        //j < length -i -1 原因:每循环一次,最后一位数已排好,不用再比
        for j := 0; j < length-i-1; j++ {
            if arr[j] > arr[j+1] {
                arr[j], arr[j+1] = arr[j+1], arr[j]
            }
        }
    }
    return arr
}
 
//冒泡排序优化版,如果某次循环发现没有需要交换的元素,则认为整个排序已完成
func BubbleSortPro(arr [11]int) [11]int {
    length := len(arr)
    for i := 0; i < length; i++ {
        over := false
        for j := 0; j < length-i-1; j++ {
            if arr[j] > arr[j+1] {
                over = true
                arr[j], arr[j+1] = arr[j+1], arr[j]
            }
        }
        if over == false {
            break
        }
    }
    return arr
}
 
 
//归并排序
func MergeSort(arr []int) []int {
    length := len(arr)
    if length < 2 {
        return arr
    }
    i := length / 2
    left := MergeSort(arr[0:i])
    right := MergeSort(arr[i:])
    res := merge(left, right)
    return res
}
 
//合并数组
func merge(left, right []int) []int {
    result := make([]int, 0)
    m, n := 0, 0
    l, r := len(left), len(right)
    //比较两个数组,谁小把元素值添加到结果集内
    for m < l && n < r {
        if left[m] > right[n] {
            result = append(result, right[n])
            n++
        } else {
            result = append(result, left[m])
            m++
        }
    }
    //如果有一个数组比完了,另一个数组还有元素的情况,则将剩余元素添加到结果集内
    result = append(result, right[n:]...)
    result = append(result, left[m:]...)
    return result
}
 
//快排,以第一个值为标准,小于此值的放左边,大于此值放右边,将第一个值放中间,在分好的数组里如此往复
func QuickSort(arr []int) []int {
    length := len(arr)
    if length <= 1 {
        return arr
    }
    p := 0
    res := quickSort(arr, p, length-1)
    return res
}
 
//递归方法
func quickSort(arr []int, p int, r int) []int {
    if p >= r {
        return arr
    }
    q := partition(arr, p, r)
    quickSort(arr, p, q-1)
    quickSort(arr, q+1, r)
    return arr
}
 
//排序并返回pivot
func partition(arr []int, p int, r int) int {
    k := arr[p]
    j := p
    for i := p; i < r; i++ {
        if k > arr[i] {
            arr[i], arr[j] = arr[j], arr[i]
            j++
        }
    }
    arr[r], arr[j] = arr[j], arr[r]
    return j
}

  

 
posted @   郁冬  阅读(1271)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示