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()
}
Go数据结构(排序算法)
最新推荐文章于 2024-08-21 12:03:50 发布