分享
使用go实现的排序算法
light · · 1335 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
go实现的部分排序算法,待整理
// algorithm project main.go
package main
import (
"fmt"
)
func main() {
arr := []int{50, 45, 42, 30, 25, 20, 20, 5, 60, 3, 23, 50, 29, 235, 9}
//arr := []int{50, 235, 60}
fmt.Println(arr)
fmt.Println("----------")
//直接插入排序
//arr1 := insertSort(arr)
//arr1 := selectSort(arr)
//a, b := selectMinAndMax(arr, 0, 14)
//arr1 := selectSortPlus(arr)
quickSort(arr, 0, len(arr)-1)
fmt.Println(arr)
}
/******** 冒泡排序begin ********/
func bubbleSort(arr []int) []int {
length := len(arr)
for j := length - 1; j > 0; j-- {
for i := 0; i < j; i++ {
if arr[i] > arr[i+1] {
exchange(arr, i, i+1)
fmt.Println(arr)
}
}
fmt.Println("++++++++++")
}
return arr
}
/******** 冒泡排序end ********/
/******* 直接插入排序begin ********/
//注意第一次排序应该是把第一位,即索引为0的看做一个有序序列了
func insertSort(arr []int) []int {
//获取当前数组长度
length := len(arr)
for i := 1; i < length; i++ {
//当前值
now := arr[i]
//如果当前哨兵小于之前序列中的某一个k的值,则序列从k向后整体移动一位
for j := i - 1; j >= 0; j-- {
if now < arr[j] {
arr[j+1] = arr[j]
arr[j] = now
} else {
arr[j+1] = now
break
}
}
fmt.Println(arr)
}
return arr
}
/******* 直接插入排序end ********/
/******* 选择排序-简单选择排序begin ********/
//选出最小的key值
/*
@param arr 待排序数组
@param i从第i个元素获取最小值
*/
func selectMin(arr []int, i int) int {
length := len(arr)
minKey := i
minValue := arr[minKey]
//从下标为i及之后的元素中找出值最小的元素
for k := minKey + 1; k < length; k++ {
if minValue > arr[k] {
//如果当前值大于之后某一元素,说明不是最小值,和之后元素交换
minKey = k
minValue = arr[k]
}
}
return minKey
}
func exchange(arr []int, a int, b int) {
temp := arr[a]
arr[a] = arr[b]
arr[b] = temp
}
//开始进行选择排序
func selectSort(arr []int) []int {
length := len(arr)
for i := 0; i < length; i++ {
//每循环一次都找出当前未排序元素中的最小值,和当前元素进行交换
minKey := selectMin(arr, i)
exchange(arr, i, minKey)
fmt.Println(i, arr)
}
return arr
}
/******* 选择排序-简单选择排序end ********/
/******** 选择排序的改进,二元选择排序begin ********/
func selectMinAndMax(arr []int, i int, j int) (int, int) {
//length := len(arr)
minKey := i
minValue := arr[minKey]
maxKey := j
maxValue := arr[maxKey]
//从下标为i及之后的元素中找出值最小的元素
for k := minKey + 1; k < j; k++ {
if minValue > arr[k] {
//如果当前值大于之后某一元素,说明不是最小值,和之后元素交换
minKey = k
minValue = arr[k]
}
if maxValue < arr[k] {
maxKey = k
maxValue = arr[k]
}
}
return minKey, maxKey
}
func selectSortPlus(arr []int) []int {
length := len(arr)
//
for i := 0; i <= length/2; i++ {
//一次循环,找出最大和最小值,分别替换最大端和最小端顶头部分
minKey, maxKey := selectMinAndMax(arr, i, length-1-i)
exchange(arr, i, minKey)
exchange(arr, length-1-i, maxKey)
fmt.Println(minKey, maxKey)
}
return arr
}
/******** 选择排序的改进,二元选择排序end ********/
/******** 快速排序begin ********/
func quickSort(arr []int, left int, right int) {
fmt.Println(left, right)
//设置基准数,选择第一个作为基准数
baseKey := left
baseValue := arr[baseKey]
i := left
j := right
for i < j {
fmt.Println(i, j)
//先从右向左找,直到找到一个小于基准数的值
for (arr[j] >= baseValue) && (i < j) {
j--
}
if i < j {
//将j的值放到i的空位上
arr[i] = arr[j]
}
//从左向右找,直到找到一个大于基准数的值
for (i < j) && (arr[i] < baseValue) {
i++
}
if i < j {
//将此时的i放到之前j产生的空位上
arr[j] = arr[i]
}
fmt.Println(i, j)
}
arr[i] = baseValue
fmt.Println(arr)
if left < i-1 {
quickSort(arr, left, i-1)
}
if i+1 < right {
quickSort(arr, i+1, right)
}
}
/******** 快速排序end ********/
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信1335 次点击
上一篇:Golang ssh并ping包
下一篇:谈谈开源(一)
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
go实现的部分排序算法,待整理
// algorithm project main.go
package main
import (
"fmt"
)
func main() {
arr := []int{50, 45, 42, 30, 25, 20, 20, 5, 60, 3, 23, 50, 29, 235, 9}
//arr := []int{50, 235, 60}
fmt.Println(arr)
fmt.Println("----------")
//直接插入排序
//arr1 := insertSort(arr)
//arr1 := selectSort(arr)
//a, b := selectMinAndMax(arr, 0, 14)
//arr1 := selectSortPlus(arr)
quickSort(arr, 0, len(arr)-1)
fmt.Println(arr)
}
/******** 冒泡排序begin ********/
func bubbleSort(arr []int) []int {
length := len(arr)
for j := length - 1; j > 0; j-- {
for i := 0; i < j; i++ {
if arr[i] > arr[i+1] {
exchange(arr, i, i+1)
fmt.Println(arr)
}
}
fmt.Println("++++++++++")
}
return arr
}
/******** 冒泡排序end ********/
/******* 直接插入排序begin ********/
//注意第一次排序应该是把第一位,即索引为0的看做一个有序序列了
func insertSort(arr []int) []int {
//获取当前数组长度
length := len(arr)
for i := 1; i < length; i++ {
//当前值
now := arr[i]
//如果当前哨兵小于之前序列中的某一个k的值,则序列从k向后整体移动一位
for j := i - 1; j >= 0; j-- {
if now < arr[j] {
arr[j+1] = arr[j]
arr[j] = now
} else {
arr[j+1] = now
break
}
}
fmt.Println(arr)
}
return arr
}
/******* 直接插入排序end ********/
/******* 选择排序-简单选择排序begin ********/
//选出最小的key值
/*
@param arr 待排序数组
@param i从第i个元素获取最小值
*/
func selectMin(arr []int, i int) int {
length := len(arr)
minKey := i
minValue := arr[minKey]
//从下标为i及之后的元素中找出值最小的元素
for k := minKey + 1; k < length; k++ {
if minValue > arr[k] {
//如果当前值大于之后某一元素,说明不是最小值,和之后元素交换
minKey = k
minValue = arr[k]
}
}
return minKey
}
func exchange(arr []int, a int, b int) {
temp := arr[a]
arr[a] = arr[b]
arr[b] = temp
}
//开始进行选择排序
func selectSort(arr []int) []int {
length := len(arr)
for i := 0; i < length; i++ {
//每循环一次都找出当前未排序元素中的最小值,和当前元素进行交换
minKey := selectMin(arr, i)
exchange(arr, i, minKey)
fmt.Println(i, arr)
}
return arr
}
/******* 选择排序-简单选择排序end ********/
/******** 选择排序的改进,二元选择排序begin ********/
func selectMinAndMax(arr []int, i int, j int) (int, int) {
//length := len(arr)
minKey := i
minValue := arr[minKey]
maxKey := j
maxValue := arr[maxKey]
//从下标为i及之后的元素中找出值最小的元素
for k := minKey + 1; k < j; k++ {
if minValue > arr[k] {
//如果当前值大于之后某一元素,说明不是最小值,和之后元素交换
minKey = k
minValue = arr[k]
}
if maxValue < arr[k] {
maxKey = k
maxValue = arr[k]
}
}
return minKey, maxKey
}
func selectSortPlus(arr []int) []int {
length := len(arr)
//
for i := 0; i <= length/2; i++ {
//一次循环,找出最大和最小值,分别替换最大端和最小端顶头部分
minKey, maxKey := selectMinAndMax(arr, i, length-1-i)
exchange(arr, i, minKey)
exchange(arr, length-1-i, maxKey)
fmt.Println(minKey, maxKey)
}
return arr
}
/******** 选择排序的改进,二元选择排序end ********/
/******** 快速排序begin ********/
func quickSort(arr []int, left int, right int) {
fmt.Println(left, right)
//设置基准数,选择第一个作为基准数
baseKey := left
baseValue := arr[baseKey]
i := left
j := right
for i < j {
fmt.Println(i, j)
//先从右向左找,直到找到一个小于基准数的值
for (arr[j] >= baseValue) && (i < j) {
j--
}
if i < j {
//将j的值放到i的空位上
arr[i] = arr[j]
}
//从左向右找,直到找到一个大于基准数的值
for (i < j) && (arr[i] < baseValue) {
i++
}
if i < j {
//将此时的i放到之前j产生的空位上
arr[j] = arr[i]
}
fmt.Println(i, j)
}
arr[i] = baseValue
fmt.Println(arr)
if left < i-1 {
quickSort(arr, left, i-1)
}
if i+1 < right {
quickSort(arr, i+1, right)
}
}
/******** 快速排序end ********/