go实现的经典排序算法

冒泡排序/选择排序/直接插入/归并排序/快排

package	 main

import "fmt"

func swap(arr *[]int, m,n int){
	temp := (*arr)[m]
	(*arr)[m] = (*arr)[n]
	(*arr)[n] = temp
}

// 冒泡排序
//外层循环是比较的趟数,内层循环是每一趟冒泡:比较相邻的两个数,交换较小者在前,使最小者慢慢浮上来
func bubbleSort(arr *[]int){
	length := len(*arr)
	if length == 0{
		return
	}
	for i := length-1;i>=0;i--{
		for j := length-1;j>=length-i;j--{
			if (*arr)[j] < (*arr)[j-1]{
				swap(arr,j,j-1)
			}
		}
	}
}

func TestBubbleSort(){
	var arr = []int{4,7,3,8,1,5,2,9,6}
	bubbleSort(&arr)
	fmt.Println("冒泡:",arr)
}

//直接插入排序
//将数组分为两部分,前者是有序的,后者是无序的,
//每一趟从无序数组中选择第一个,插入到有序数组正确的位置
func insertSort(arr *[]int){
	length := len(*arr)
	if length == 0{
		return
	}
	for i:=1;i<length;i++{  //第一个数是有序的
		for j := i;j>=1;j--{
			if (*arr)[j] < (*arr)[j-1]{
				swap(arr,j,j-1)
			}
		}
	}
}

func TestInsertSort(){
	var arr = []int{4,7,3,8,1,5,2,9,6}
	insertSort(&arr)
	fmt.Println("直接插入:",arr)
}

//选择排序
//从无序数组红选择一个最小的 放到第一位,再选择一个第二小的,放在第二位,依次类推
func chooseSort(arr *[]int){
	length := len(*arr)
	if length == 0{
		return
	}
	for i:=0;i<length;i++{
		minIndex := i
		for j := length -1;j>=i;j--{
			if (*arr)[j] < (*arr)[minIndex]{
				minIndex = j
			}
		}
		swap(arr,i,minIndex)
	}
}

func TestChooseSort(){
	var arr = []int{4,7,3,8,1,5,2,9,6}
	chooseSort(&arr)
	fmt.Println("直接选择:",arr)
}

//归并排序
// 先划分成长度为length/2 的子数组,继续将子数组划分成长度为length/4,直到长度=1,进行merge
func mergeSort(arr *[]int){
	length := len(*arr)
	if length == 0{
		return
	}
	mergeSortByLen(arr,0,length-1)
}

func mergeSortByLen(arr *[]int, low,high int){
	if low<high{
		mid := (low+high)/2
		mergeSortByLen(arr,low,mid)
		mergeSortByLen(arr,mid+1,high)
		merge(arr,low,mid,high)
	}
}

func merge(arr *[]int,low,mid,high int){
	var brr []int
	var (
		i = low
		j = mid+1
	)
	for i<=mid && j <=high{
		if (*arr)[i] < (*arr)[j]{
			brr = append(brr,(*arr)[i])
			i++
		}else{
			brr = append(brr,(*arr)[j])
			j++
		}
	}
	for i<= mid{
		brr = append(brr,(*arr)[i])
		i++
	}
	for j<=high{
		brr = append(brr,(*arr)[j])
		j++
	}
	for i:=0;i<len(brr);i++{
		(*arr)[low] = brr[i]
		low++
	}
}

func TestMergeSort(){
	var arr = []int{4,7,3,8,1,5,2,9,6}
	mergeSort(&arr)
	fmt.Println("归并:",arr)
}

//快排
func QuickSort(arr *[]int){
	if len(*arr) == 0{
		return
	}
	quick(arr,0,len(*arr)-1)
}
//挖坑填数法,选择一个基数(一般是第一个),两个指针指向头尾,
//比基数小的放在基数的左边,比基数大的放在基数的右边,
func quick(arr *[]int,left,right int){
	low,high := left,right
	pivot := (*arr)[low]
	for low < high{
		for low<high &&  (*arr)[high] > pivot{
			high --
		}
		if low < high{
			(*arr)[low] = (*arr)[high]
			low++
		}
		for low<high &&  (*arr)[low] < pivot{
			low ++
		}
		if low < high{
			(*arr)[high] = (*arr)[low]
			high --
		}
	}
	(*arr)[low] = pivot
	if low - left > 1{
		quick(arr,left,low-1)
	}
	if right-low > 1{
		quick(arr,low+1,right)
	}
}

func TestQuickSort(){
	var arr = []int{7,9,1,4,2,5,3,6,8}
	QuickSort(&arr)
	fmt.Println("快排:",arr)
}

func TestSort(){
	TestBubbleSort()
	TestInsertSort()
	TestChooseSort()
	TestMergeSort()
	TestQuickSort()
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值