冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
示意图:

排序思想:
代码实现:
package main
import (
"fmt"
)
func main() {
//1.定义测试数组
var intArr = [...]int{
10, 5, 11, 9, 0} //test01
//2.输出排序前数组;
fmt.Println("排序前:", intArr)
for i := 0; i < len(intArr)-1; i++ {
//3.如果一轮遍历比较后,没有发生过交换,则当前每一个数都比他后面的数小,
//即当前数组已有序;则立即可停止排序;
//定义 is_changed ,记录每轮发生过交换;
var is_changed bool
for j := 0; j < len(intArr)-1-i; j++ {
if intArr[j+1] < intArr[j] {
//如果顺序不对,则发生交换,字段变为 true;
is_changed = true
//交换两数位置;
intArr[j] = intArr[j+1] ^ intArr[j]
intArr[j+1] = intArr[j+1] ^ intArr[j]
intArr[j] = intArr[j+1] ^ intArr[j]
}
}
fmt.Printf("经过%v轮遍历;冒泡排序后结果为:%v\n", i+1, intArr)
//如果一整轮没交换过,则已经有序;退出排序;
if is_changed == false {
fmt.Printf("现在已经有序,直接停止;\n")
break
}
}
}
运行结果:
[Running] go run "e:\golang开发学习\go_pro\test.go"
排序前: [10 5 11 9 0]
经过1轮遍历;冒泡排序后结果为:[5 10 9 0 11]
经过2轮遍历;冒泡排序后结果为:[5 9 0 10 11]
经过3轮遍历;冒泡排序后结果为:[5 0 9 10 11]
经过4轮遍历;冒泡排序后结果为:[0 5 9 10 11]
[Done] exited with code=0 in 2.41 seconds
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序的目的。
示意图:

排序思想:
代码实现:
package main
import (
"fmt"
"math/rand"
"time"
)
func Select_Sort(arr []int) {
for i := 0; i < len(arr)-1; i++ {
// 假设最小值是无序区的第一个位置
min_loc := i
// 自己不用跟自己比较
for j := i + 1; j < len(arr); j++ {
if arr[min_loc] > arr[j] {
min_loc = j
}
}
arr[min_loc], arr[i] = arr[i], arr[min_loc]
}
}
// 生成随机int切片 正整数 rand.Intn返回一个非负伪随机数[0,n)作为int。如果n <= 0则报错
func rand_array(arr []int, min int, max int) {
if min >= max || min == 0 || max == 0 {
fmt.Println("输入最大, 最小值有误!")
return
}
// 如果不加这个 每次会生成一样的
rand.Seed(time.Now().Unix())
for i := 0; i < len(arr); i++ {
arr[i] = rand.Intn(max-min) + min
}
}
func main() {
min := 5
max := 100
var mylist []int = make([]int, 10)
rand_array(mylist, min, max)
fmt.Printf("随机的int 切片为:%d\n", mylist)
Select_Sort(mylist)
fmt.Printf("选择排序后的int 切片为:%d\n", mylist)
}
运行结果:
[Running] go run "e:\golang开发学习\go_pro\test.go"
随机的int 切片为:[29 50 37 36 70 19 56 64 66 88]
选择排序后的int 切片为:[19 29 36 37 50 56 64 66 70 88]
[Done] exited with code=0 in 1.246 seconds
插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的
示意图:

排序思想:
代码实现:
package main
import "fmt"
func Insert_Sort(arr *[7]int) {
for i := 1; i < len(arr); i++ {
inserVal := arr[i]
inserIndex := i - 1 //下标
//从大到小
for inserIndex >= 0 && arr[inserIndex] < inserVal {
arr[inserIndex+1] = arr[inserIndex] //数据后移
inserIndex--
}
//插入
if inserIndex+1 != i {
arr[inserIndex+1] = inserVal
}
fmt.Printf("第%d此插入后: %v\n", i, *arr)
}
}
func main() {
arr := [7]int{
23, 0, 12, 56, 34, -1, 55}
fmt.Println("原始数组为:", arr)
Insert_Sort(&arr)
fmt.Println(arr)
}
运行结果:
[Running] go run "e:\golang开发学习\go_pro\test.go"
原始数组为: [23 0 12 56 34 -1 55]
第1此插入后: [23 0 12 56 34 -1 55]
第2此插入后: [23 12 0 56 34 -1 55]
第3此插入后: [56 23 12 0 34 -1 55]
第4此插入后: [56 34 23 12 0 -1 55]
第5此插入后: [56 34 23 12 0 -1 55]
第6此插入后: [56 55 34 23 12 0 -1]
[56 55 34 23 12 0 -1]
[Done] exited with code=0 in 1.666 seconds
快速排序(Quicksort)是对冒泡排序的一种改进。
排序思想:
示意图:

应用实例:
要求:对 [-9,78,0,23,-567,70] 进行从小到大的排序
说明 [ 验证分析 ]:
代码实现:
package main
import (
"fmt"
)
//快速排序
//说明
//1. left 表示 数组左边的下标
//2. right 表示数组右边的下标
//3 array 表示要排序的数组
func QuickSort(left int, right int, array *[9]int)