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)}{\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)
}

  

 

posted @ 2020-06-21 22:21  Tuski411  阅读(73)  评论(0)    收藏  举报