Go数据结构(排序算法)

package main

import "fmt"

type SortMethods interface {
	//(从小到大排序) 选 、 冒 、插 都是时间复杂度为n2的排序算法
	toString()
	getLength() int
	insertionSort() //插入排序 始终保持方块内的顺序正确   排好序的放在最前
	bubbleSort()    //冒泡排序 轮回调整灰色区域内标红的两个值的顺序 排好序的放在最后
	selectionSort() //选择排序 从灰色方块内选择最小的排在前面
	quickSort(left, right int)
}

type Array struct {
	value []int
}

func (arr *Array) toString() {
	for i := 0; i < len(arr.value); i++ {
		fmt.Print(arr.value[i], " ")
	}
	fmt.Println()
}
func (arr *Array) getLength() int {
	return len(arr.value)
}

func (arr *Array) insertionSort() {
	n := len(arr.value)
	for i := 1; i < n; i++ {
		key := arr.value[i]
		j := i - 1
		for j >= 0 && arr.value[j] > key {
			arr.value[j+1] = arr.value[j]
			j = j - 1
		}
		arr.value[j+1] = key
	}
}

// []int{28, 38, 88, 98, 68, 78, 48, 18, 8, 58}}
func (arr *Array) bubbleSort() {
	n := len(arr.value)
	for i := n; i > 0; i-- {
		for j := n - i - 1; j >= 0; j-- {
			temp := arr.value[j]
			if arr.value[j+1] < arr.value[j] {
				arr.value[j] = arr.value[j+1]
				arr.value[j+1] = temp
			}
		}
	}
}
func (arr *Array) selectionSort() {
	n := len(arr.value)
	for i := 0; i < n; i++ {
		min_idx := i
		for j := i + 1; j < n; j++ {
			if arr.value[j] < arr.value[min_idx] {
				min_idx = j
			}
		}
		arr.value[i], arr.value[min_idx] = arr.value[min_idx], arr.value[i]
	}
}

// 选择数组中的第一个元素作为枢轴元素,并使用双指针i和j从枢轴元素的下一个元素开始,分别向左右两侧遍历,
// 将小于枢轴元素的元素交换到左侧,大于枢轴元素的元素交换到右侧
// 直到i和j相遇 然后将枢轴元素与i-1位置的元素交换,将左半部分和右半部分分别递归调用快速排序函数进行排序。
func (arr *Array) quickSort(left, right int) {
	if left < right {
		pivot := arr.value[left] //一般都是第一个元素作为pivot
		i := left + 1            //然后从pivot后的元素开始向后遍历
		for j := i; j <= right; j++ {
			//如果当前元素比pivot小 那么就把当前元素和 pivot后的首个元素交换位置 交换完毕之后 pivot后的首个元素的位置后移
			if arr.value[j] < pivot {
				arr.value[i], arr.value[j] = arr.value[j], arr.value[i]
				i++
			}
		}
		//每一轮循环完毕之后 都元素左移过的都是小于pivot的 右移过的都是大于pivot的
		//在交换过程中,需要将 arr.value[left] 和 arr.value[i-1] 两个元素的值进行交换,以确保小于枢轴元素的元素都放在枢轴元素的左边,大于枢轴元素的元素都放在枢轴元素的右边。
		arr.value[left], arr.value[i-1] = arr.value[i-1], arr.value[left]
		pi := i - 1
		arr.quickSort(left, pi-1)
		arr.quickSort(pi+1, right)
	}

}

func main() {
	var arr SortMethods
	arr = &Array{value: []int{28, 38, 98, 88, 68, 78, 48, 18, 8, 58}}
	arr.quickSort(0, arr.getLength()-1)
	arr.toString()
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值