Golang实现基本排序算法

手写相关排序算法 (待更新)

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func simpleSort(data *[]int) {
	// O(n^2) ,每次从子列表找出最小的位置和当前位置交换
	for i := 0; i < len(*data); i++ {
		minIndex := i
		for j := i; j < len(*data); j++ {
			// 从当前元素群中找出比minIndex位置更小的元素
			if (*data)[j] < (*data)[minIndex] {
				minIndex = j
			}
		}
		if minIndex != i {
			(*data)[i], (*data)[minIndex] = (*data)[minIndex], (*data)[i]
		}
	}
}

func insertSort(data *[]int) {
	// 直接插入排序,从后往前,若[0,i-1]有序,将[i]与前面逐个比较,比它大的往后挪
	for i := 1; i < len(*data); i++ { //元素长度要大于1
		temp := (*data)[i]
		j := i
		for {
			if j < 1 || (*data)[j-1] < temp { // 当扫描到一个值比temp小离开停止
				break
			}
			(*data)[j] = (*data)[j-1]
			j = j - 1
		}
		(*data)[j] = temp
	}
}

func partition(data *[]int, left, right int) int {
	// 记第一个为划分节点
	temp := (*data)[left]
	for {
		if left >= right {
			break
		}
		for {
			// 从右往左
			if left >= right || (*data)[right] <= temp {
				break //当前ritgh处值比temp小
			}
			right = right - 1
		}
		// 右往左找到第一个小于等于temp的元素,进行交换
		(*data)[left] = (*data)[right]
		for {
			//从左往右
			if left >= right || (*data)[left] > temp {
				break // 当前left处值比temp大
			}
			left = left + 1
		}
		// 左往右找到第一个大于temp的元素,进行交换
		(*data)[right] = (*data)[left]
	}
	// 直到left和right相遇
	(*data)[left] = temp
	return left
}

func quickSort(data *[]int, left, right int) {
	// 快速排序,每次将mid划分左右两个区间,区间里面再进行划分
	// 有序时间复杂度为O(n^2) 无序为O(n log n)
	if left < right {
		mid := partition(data, left, right)
		quickSort(data, left, mid-1)
		quickSort(data, mid+1, right)
	}
}

func main() {
	input := bufio.NewScanner(os.Stdin)
	for input.Scan() {
		n, _ := strconv.Atoi(input.Text())
		input.Scan()
		str := strings.Split(input.Text(), " ")
		data := make([]int, 0)
		for i := 0; i < n; i++ {
			temp, _ := strconv.Atoi(str[i])
			data = append(data, temp)
		}
		// 简单选择排序
		// simpleSort(&data)
		// 插入排序
		// insertSort(&data)
		// 快速排序
		quickSort(&data, 0, len(data)-1)
		fmt.Println(data)
	}
}



  1. golang对结构体排序
    在这里插入图片描述
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
	"strings"
)

type student struct {
	id      string
	all_pf  int // 总体排名
	addr    int // 考场号
	addr_pf int // 考场内排名
	score   int
}

func main() {
	input := bufio.NewScanner(os.Stdin)
	input.Scan()
	n, _ := strconv.Atoi(input.Text())
	nums := 0

	resu := make([]student, 0)
	for input.Scan() {
		stus := make([]student, 0)
		m, _ := strconv.Atoi(input.Text())
		for i := 0; i < m; i++ {
			// 读取m行考生数据
			input.Scan()
			stu := student{}
			str := strings.Split(input.Text(), " ")
			stu.id = str[0]
			stu.addr = nums
			stu.score, _ = strconv.Atoi(str[1])
			stus = append(stus, stu)
		}
		fmt.Println(stus)
		// 对当前内部排序
		sort.SliceStable(stus, func(i, j int) bool {
			if stus[i].score > stus[j].score {
				return true
			} else if stus[i].score == stus[j].score {
				if stus[i].id < stus[j].id {
					return true
				} else {
					return false
				}
			} else {
				return false
			}
		})
		// 排完序对内部的编号赋值
		for i := 0; i < len(stus); i++ {
			if i == 0 {
				stus[i].addr_pf = 1
			} else {
				if stus[i].score == stus[i-1].score {
					stus[i].addr_pf = stus[i-1].addr_pf
				} else {
					stus[i].addr_pf = i + 1
				}
			}
		}
		resu = append(resu, stus...)
		nums = nums + 1
		if nums == n {
			break
		}
	}
	fmt.Println(resu)
	sort.SliceStable(resu, func(i, j int) bool {
		if resu[i].score > resu[j].score {
			return true
		} else if resu[i].score == resu[j].score {
			if resu[i].id < resu[j].id {
				return true
			} else {
				return false
			}
		} else {
			return false
		}

	})
	// 排完序对内部的编号赋值
	for i := 0; i < len(resu); i++ {
		if i == 0 {
			resu[i].all_pf = 1
		} else {
			if resu[i].score == resu[i-1].score {
				resu[i].all_pf = resu[i-1].all_pf
			} else {
				resu[i].all_pf = i + 1
			}
		}
	}
	fmt.Println(resu)
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值