go之排序算法
1.冒泡排序
重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
package main
import (
"fmt"
"math/rand"
"time"
"sync"
)
func selects() {
t := time.Now()
rand.Seed(time.Now().Unix())
var m [] int
var w sync.WaitGroup
f := func(){
for i:=0; i<30000; i++ {
m = append(m,rand.Intn(30000))
}
w.Done()
}
for s:=0 ;s<4;s++{
w.Add(1)
go f()
}
w.Wait()
for i:=0;i<len(m);i++{
max := m[i]
k := i
for j:=i+1;j<len(m);j++{
if m[j] > max {
max = m[j]
k = j
}
}
temp := m[i]
m[i] = max
m[k] = temp
}
t2 := time.Now().Sub(t)
fmt.Print(t2)
// fmt.Println(m)
}
2.选择排序法
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
func bubble() {
t := time.Now()
rand.Seed(time.Now().Unix())
var m [] int
for i:=0; i<30000; i++{
m = append(m,rand.Intn(30000))
}
for i:=0; i<len(m); i++ {
for j:=0; j<len(m); j++ {
if m[i] > m[j] {
temp := m[i]
m[i] = m[j]
m[j] = temp
}
}
}
t2 := time.Now().Sub(t)
fmt.Print(t2)
}
3.插入排序法
通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到{\displaystyle O(1)}的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
func insertion () {
t := time.Now()
var values = []int {3,12,22,32,4,35,46,7}
length := len(values)
if length <= 1 {
return
}
for i := 1; i < length; i++ {
tmp := values[i] // 从第二个数开始,从左向右依次取数
key := i - 1 // 下标从0开始,依次从左向右
// 每次取到的数都跟左侧的数做比较,如果左侧的数比取的数大,就将左侧的数右移一位,直至左侧没有数字比取的数大为止
for key >= 0 && tmp < values[key] {
values[key+1] = values[key]
key--
//fmt.Println(values)
}
// 将取到的数插入到不小于左侧数的位置
if key+1 != i {
values[key+1] = tmp
}
}
fmt.Println(values)
t2 := time.Now().Sub(t)
fmt.Print(t2)
}
浙公网安备 33010602011771号