各种排序用go实现-初入门径
一共包含 冒泡排序,选择排序,插入排序,快速排序以及堆排序
详细自己看代码吧;
学习go语言的第一周;给自己布置了排序算法用go实现的任务;以后每周记录一周的大任务!
package main
import "fmt"
//冒泡排序
func bsort(ar []int) {
for i := 0; i < len(ar); i++ { //花括号{必须在这一行 if也一样
for j := i + 1; j < len(ar); j++ {
if ar[i] > ar[j] {
ar[i], ar[j] = ar[j], ar[i] //相比某语言不需要临时交换变量
}
}
}
}
// 选择排序
func SelectSort(data []int) {
length := len(data)
for i := 0; i < length; i++ {
tmp := data[i]
flag := i
for j := i + 1; j < length; j++ {
if data[j] < tmp {
tmp = data[j]
flag = j
}
}
if flag != i {
data[flag] = data[i]
data[i] = tmp
}
fmt.Println(data) //为了看具体排序的过程
}
}
//插入排序
func isort(ar []int){
for i := 0; i < len(ar); i++ { //花括号{必须在这一行 if也一样
for j := i; j>0; j--{
if ar[j] > ar[j-1] {
break
}
ar[j],ar[j-1]=ar[j-1],ar[j]
}
}
}
//快速排序 分治法(类似与二分)
func qsort(ar []int,left,right int){
if left >= right {
return
}
val :=ar[left]
k:=left
//确定val的位置
for i:=left+1;i<=right;i++ {
if ar[i] < val {
ar[k]=ar[i]
ar[i]=ar[k+1]
k++
}
}
ar[k]=val
qsort(ar,left,k-1)
qsort(ar,k+1,right)
}
// 堆排序
func minHeap( ar []int,root int, end int) {
for {
var child = 2*root + 1
//判断是否存在child节点
if child > end {
break
}
//判断右child是否存在,如果存在则和另外一个同级节点进行比较
if child+1 <= end && ar[child] > ar[child+1] {
child += 1
}
if ar[root] > ar[child] {
ar[root], ar[child] = ar[child], ar[root]
root = child
} else {
break
}
}
}
//降序排序
func HeapSort(ar []int) {
var n = len(ar)-1
for root := n / 2; root >= 0; root-- {
minHeap(ar,root, n)
}
fmt.Println("堆构建完成")
for end := n; end >=0; end-- {
if ar[0]<ar[end]{
ar[0], ar[end] = ar[end], ar[0]
minHeap(ar,0, end-1)
}
}
}
func main() {
b:=[...]int{8,7,5,4,17,16}
//bsort(b[:])
//SelectSort(b[:])
//isort(b[:])
//qsort(b[:],0,len(b)-1)
HeapSort(b[:])
fmt.Println(b)
//println("hello world")
}
懒惰是大忌!

浙公网安备 33010602011771号