zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Go 冒泡、鸡尾酒、快速、插入 排序

2023-04-18 16:08:46 时间
package main

import "fmt"

var sli = []int{1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39}

//冒泡排序
func bubbleSort(sli []int) []int {
	len := len(sli)
	//该层循环控制 需要冒泡的轮数
	for i := 0; i < len; i++ {
		//该层循环用来控制每轮 冒出一个数 需要比较的次数
		for j := 0; j < len-1; j++ {
			if sli[i] < sli[j] {
				sli[i], sli[j] = sli[j], sli[i]
			}
		}
	}
	return sli
}

//鸡尾酒排序
func cocktail_sort(arr []int,  len int)[]int  {
	var j, left int
	right := len - 1
	for  (left < right) {
		for j = left; j < right; j++{
			if (arr[j] > arr[j + 1]){
				//swap(arr[j], arr[j + 1])

				arr[j], arr[j + 1] = arr[j + 1], arr[j]
			}

		}

	right--;
	for j = right; j > left; j--{
			if (arr[j - 1] > arr[j]){
				//swap(arr[j - 1], arr[j])
				arr[j], arr[j - 1] = arr[j - 1], arr[j]
			}

		}

	left++;
	}
	return arr
}

//快速排序
func quickSort(sli []int) []int {
	//先判断是否需要继续进行
	len := len(sli)
	if len <= 1 {
		return sli
	}
	//选择第一个元素作为基准
	base_num := sli[0]
	//遍历除了标尺外的所有元素,按照大小关系放入左右两个切片内
	//初始化左右两个切片
	left_sli := []int{}  //小于基准的
	right_sli := []int{} //大于基准的
	for i := 1; i < len; i++ {
		if base_num > sli[i] {
			//放入左边切片
			left_sli = append(left_sli, sli[i])
		} else {
			//放入右边切片
			right_sli = append(right_sli, sli[i])
		}
	}

	//再分别对左边和右边的切片进行相同的排序处理方式递归调用这个函数
	left_sli = quickSort(left_sli)
	right_sli = quickSort(right_sli)

	//合并
	left_sli = append(left_sli, base_num)
	return append(left_sli, right_sli...)
}

//插入排序
func insertSort(sli []int) []int {
	len := len(sli)
	for i := 0; i < len; i++ {
		tmp := sli[i]
		//内层循环控制,比较并插入
		for j := i - 1; j >= 0; j-- {
			if tmp < sli[j] {
				//发现插入的元素要小,交换位置,将后边的元素与前面的元素互换
				sli[j+1], sli[j] = sli[j], tmp
			} else {
				//如果碰到不需要移动的元素,则前面的就不需要再次比较了。
				break
			}
		}
	}
	return sli
}
func main() {
	//res := bubbleSort(sli)
	//fmt.Println(res)
	//res1 := cocktail_sort(sli,len(sli))
	//fmt.Println(res1)

	//res := quickSort(sli)
	//fmt.Println(res)

	res := insertSort(sli)
	fmt.Println(res)
}