go语言实现几种排序

1.冒泡排序

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func bubble_sort(arr []int){
	var flag bool
	for i:=0;i<len(arr)-1;i++{
		flag = true
		for j:=0;j<len(arr)-1-i;j++{
			if arr[j] > arr[j+1]{
				arr[j],arr[j+1] = arr[j+1],arr[j]
				flag = false
			}
		}
		if flag{
			break
		}
	}
}

func main(){
	arr := make([]int, 10)
	rand.Seed(time.Now().UnixNano())
	for i:=0;i<len(arr);i++{
		arr[i] = rand.Intn(100)
	}
	fmt.Println("排序前", arr)
	bubble_sort(arr)
	fmt.Println("排序后", arr)
}

  

2.选择排序

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func select_sort(arr []int){
	//先假设第一个元素为最小,让后面的元素和第一个进行比较,如果大了就进行交换
	//然后假设第二个元素为第二小,依次类推
	for i:=0;i<len(arr)-1;i++{
		for j:=i+1;j<len(arr);j++{
			if arr[j] < arr[i]{
				arr[i],arr[j] = arr[j],arr[i]
			}
		}
	}
}


func main(){
	arr := make([]int, 10)
	rand.Seed(time.Now().UnixNano())
	for i:=0;i<len(arr);i++{
		arr[i] = rand.Intn(100)
	}
	fmt.Println("排序前", arr)
	select_sort(arr)
	fmt.Println("排序后", arr)
}

  

3.插入排序

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func insert_sort(arr []int){
	for i:=1;i<len(arr);i++{
		j := i - 1
		for j>=0 && arr[j]>arr[j+1]{
			arr[j],arr[j+1] = arr[j+1],arr[j]
			j -= 1
		}
	}
}

func main(){
	arr := make([]int, 10)
	rand.Seed(time.Now().UnixNano())
	for i:=0;i<len(arr);i++{
		arr[i] = rand.Intn(100)
	}
	fmt.Println("排序前", arr)
	insert_sort(arr)
	fmt.Println("排序后", arr)
}

  

4.选择排序

package main

import (
	"fmt"
	"math/rand"
	"time"
)

/*
快速排序原理:
先选择一个数,进行排序,使得左边的数比它小,右边的数比它大
如何实现:想象两个指针,一个从左往右走,另一个从右往左走
先从最右边开始走,如果大的话就继续向左走,当比选择的数小的话,就让右指针等于左指针此时所指的数,此时两个数一样
然后从左往右开始走,如果小的话就继续往右走,当比选择的数大的话,就让左指针等于右指针此时所指的数,此时两个数右一样,但是之前相等的数字换回来了
然后再从右边开始找,满足条件继续交换,然后从左边开始找
直到使得左边的数比选择的数字小,右边比选择的数字大,但是这样肯定会多出来一个重复的指,所以最后再交换回来。
然后以选择的数字为基准,相当于左右又分成了两个数组。看到这,应该想到了,使用递归,不断分割,直至无法分割的时候,那么数组的顺序便排好了。
 */

func partition(arr []int, left, right int)int{
	//我们选择数字就从左往右选择,先找个变量把值存起来
	tmp := arr[left]
	for left < right{
		//先从右指针开始,当left小于right并且右边的数字比选择的数字大的时候,继续往左走
		for left < right && arr[right] > tmp{
			right -= 1
		}
		//如果右边的数字比选择的数字小,那么就让左指针指的数等于右指针所指的数
		arr[left] = arr[right]

		//然后轮到左指针,当left小于right并且左边的数字比选择的数字小的时候,继续右左走
		for left < right && arr[left] < tmp{
			left += 1
		}
		//如果左边的数字比选择的数字大,那么就让右指针指的数等于左指针指的数
		arr[right] = arr[left]
	}
	//以上不断循环,便会交换完毕,但是会多出来一个重复的指,所以再交换回去
	arr[left] = tmp
	return left
}

func quick_sort(arr []int,left,right int){
	if left < right{
		mid := partition(arr, left, right)
		//找到了mid,也就是那个最终选择的数字的索引,然后递归
		quick_sort(arr, left, mid-1)
		quick_sort(arr, mid+1, right)
	}
}

func main(){
	arr := make([]int, 10)
	rand.Seed(time.Now().UnixNano())
	for i:=0;i<len(arr);i++{
		arr[i] = rand.Intn(100)
	}
	fmt.Println("排序前", arr)
	quick_sort(arr, 0 , len(arr)-1)
	fmt.Println("排序后", arr)
}

  

猜你喜欢

转载自www.cnblogs.com/traditional/p/10076231.html
今日推荐