前言

那么这里博主先安利一些干货满满的专栏了!

首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。

高质量博客汇总https://blog.csdn.net/yu_cblog/category_12379430.html?spm=1001.2014.3001.5482在进入正题之前,博主想告诉大家,在很久之前,博主出过C++版本的九大排序算法的博客,那里面的算法解释更详细,大家有需要可以通过传送门过去看哦~

http://t.csdn.cn/QnPDghttp://t.csdn.cn/QnPDg当然,这里博主也给大家附上本项目代码的Github链接,需要源代码的伙伴们可以自取。

GitHub - Yufccode/Eight-Sorting-Implemented-by-Go: Go语言实现八大排序Go语言实现八大排序. Contribute to Yufccode/Eight-Sorting-Implemented-by-Go development by creating an account on GitHub.https://github.com/Yufccode/Eight-Sorting-Implemented-by-Go

冒泡排序

func bubble_sort(array []int, sz int) {
for i := 0; i < sz-1 ; i++ {
for j := 0; j < sz-1-i; j++ {
if array[j] > array[j+1] {
array[j], array[j+1] = array[j+1], array[j]
}
}
}
}

选择排序

func select_sort(arr []int, sz int) {
var i int = 0
var j int = 0
for i = 0; i < sz; i++ {
var min int = i
for j=i+1; j < sz; j++ {
if arr[j] < arr[min] {
min = j
}
}
arr[i], arr[min] = arr[min], arr[i]
}
}

插入排序

func insert_sort(arr []int, sz int) {
sortNum := 0
i := 0
j := 0
for i=0; i<sz; i++ {
sortNum = arr[i]
// 找插入的地方
for j=i-1; j>=0; j-- {
if arr[j] < sortNum {
break
}
arr[j+1] = arr[j]
}
arr[j+1] = sortNum
}
}

希尔排序

func shell_sort_in_group(arr []int, sz int, pos int, step int) {
sortNum := 0
i := 0
j := 0
for i=pos+step; i<sz; i+=step {
// pos + step 就是该组的第一个元素的位置
// 例如:当pos==0的时候,该组的第一个元素就是整个序列的第一个元素
// 当pos==1的时候,该组第一个元素就是这个那个序列的第二个元素
sortNum = arr[i]
for j=i-step; j>=0; j-=step {
if arr[j] < sortNum {
break
}
arr[j+step] = arr[j]
}
arr[j+step] = sortNum
}
}
func shell_sort(arr []int, sz int) {
i := 0
step := 0 // 希尔间隔
for step = sz/2; step>0; step/=2 {
// 步长为step,即共有istep个组,对每一组都执行插入排序
for i=0; i<step; i++ {
// 每一组的组排序就是插入排序的稍微修改的版本
shell_sort_in_group(arr, sz, i, step)
}
}
}

快速排序

func quick_sort_part_sort1(arr []int, begin int, end int) int {
// Hoare思想
left := begin
right := end
keyi := left
for left < right {
// 右边走,找小
for left < right && arr[right] >= arr[keyi] {
right--
}
// 左边走,找大
for left < right && arr[left] <= arr[keyi] {
left++
}
arr[left], arr[right] = arr[right], arr[left]
}
arr[keyi], arr[right] = arr[right], arr[keyi]
keyi = left
return keyi
}
func quick_sort_part_sort2(arr []int, begin int, end int) int {
// 挖坑法
key := arr[begin]
piti := begin
for begin < end {
// 右边找小的,填到左边的坑里面去,这个位置形成新的坑
for begin < end && arr[end] >= key {
end--
}
arr[piti] = arr[end]
piti = end // 左边找大的,填到右边的坑里面去,这个位置形成新的坑
for begin < end && arr[begin] <= key {
begin++
}
arr[piti] = arr[begin]
piti = begin;
}
arr[piti] = key
return piti
}
func quick_sort_by_interval(arr []int, begin int, end int) {
if begin >= end {
return // 区间不存在
}
keyi := quick_sort_part_sort1(arr, begin, end)
quick_sort_by_interval(arr, begin ,keyi-1)
quick_sort_by_interval(arr, keyi+1, end)
}
func quick_sort(arr []int, sz int) {
begin := 0
end := sz - 1
quick_sort_by_interval(arr, begin ,end)
}

堆排序

func heap_sort_adjust_down(arr []int, size int, parent int) {
child := parent*2+1
for child < size {
// 选出左右孩子中小/大的那个
if child + 1 < size && arr[child+1] > arr[child] {
child++
}
// 孩子和父亲比较
if arr[child] > arr[parent] {
arr[child], arr[parent] = arr[parent], arr[child]
parent = child
child = parent*2 + 1
} else {
break
}
}
}
func heap_sort(arr []int, sz int) {
for i:=(sz-1-1)/2; i>=0; i-- {
heap_sort_adjust_down(arr, sz, i)
}
//
end := sz-1
for end > 0 {
arr[0],arr[end] = arr[end],arr[0]
heap_sort_adjust_down(arr, end, 0)
end--
}
}

归并排序

func merge_sort_by_group(arr []int, begin int, end int, tmp_array []int){
if begin >= end {
return
}
mid := (begin + end) / 2
// [begin,mid][mid+1,end]分治递归,让子区间有序
merge_sort_by_group(arr, begin, mid, tmp_array)
merge_sort_by_group(arr, mid+1, end, tmp_array)
// 归并[begin,mid][mid+1,end]
begin1 := begin; end1 := mid;
begin2 := mid+1; end2 := end;
i := begin1
for begin1 <= end1 && begin2 <= end2 {
if arr[begin1] < arr[begin2] {
tmp_array[i] = arr[begin1]
i++
begin1++
} else {
tmp_array[i] = arr[begin2]
i++
begin2++
}
}
for begin1 <= end1 {
tmp_array[i] = arr[begin1]
i++
begin1++
}
for begin2 <= end2 {
tmp_array[i] = arr[begin2]
i++
begin2++
}
//把归并后的数据拷贝回原来的数组
copy(arr[begin:end+1], tmp_array[begin:end+1])
}
func merge_sort(arr []int, sz int) {
tmp_array := make([]int, sz) // 创建一个大小为sz的整数数组并初始化为0
merge_sort_by_group(arr, 0, sz-1, tmp_array)
}

基数排序

var (
K int = 3 // 基数排序需要的全局变量
RADIX int = 10
queue [][]int
)
func radix_sort_queue_pop(qu []int) []int {
if len(qu) == 0 {
return qu // 如果数组为空,不做任何操作
}
// 删除第一个元素
qu = qu[1:]
return qu
}
func radix_sort_queue_push(qu []int, data int) []int {
qu = append(qu, data)
return qu
}
func radix_sort_get_key(value int, k int) int {
key := 0
for k >= 0 {
key = value % 10
value /= 10
k--
}
return key
}
func radix_sort_distribute(arr []int, left int, right int, k int){
// k表示是第几次分发数据
for i:=left; i<right; i++ {
key := radix_sort_get_key(arr[i], k)
queue[key] = radix_sort_queue_push(queue[key], arr[i])
}
}
func radix_sort_collect(arr []int) {
k := 0
for i:=0; i < RADIX; i++ {
for len(queue[i]) != 0 {
arr[k] = queue[i][0] // 先进先出
k++
queue[i] = radix_sort_queue_pop(queue[i])
}
}
}
func radix_sort_by_group(arr []int, left int, right int) {
for i:=0; i<K; i++ {
// 分发数据
radix_sort_distribute(arr, left, right, i)
// 回收数据
radix_sort_collect(arr)
}
}
func radix_sort(arr []int, sz int) {
// 初始化队列
queue = make([][]int, RADIX)
left := 0
right := sz;
radix_sort_by_group(arr, left, right)
}

其他功能代码

package main

import (
"fmt"
) //...
//这里是各个排序的定义 func TestSorts() {
a := []int{1, 3, 5, 7, 9, 2, 4, 6, 8, 10, 11, 13, 12, 100, 14}
len := len(a)
output_array(a)
radix_sort(a, len)
output_array(a)
}
func others() {
a := 10
b := 5
c := (a + b)/2
fmt.Println(c)
}
func main() {
TestSorts()
}

Go语言实现八大排序|排序算法|超详细保姆级别注释的更多相关文章

  1. c语言面试宝典(经典,超详细)

    c语言面试宝典(经典,超详细) 2018年08月25日 09:32:19 chengxuyuan997 阅读数:7799   摘自:https://blog.csdn.net/chengxuyuan9 ...

  2. 【优化算法】Greedy Randomized Adaptive Search算法 超详细解析,附代码实现TSP问题求解

    01 概述 Greedy Randomized Adaptive Search,贪婪随机自适应搜索(GRAS),是组合优化问题中的多起点元启发式算法,在算法的每次迭代中,主要由两个阶段组成:构造(co ...

  3. Dijkstra算法——超~~详细!!

    Dijkstra算法_ ** 时隔多月,我又回来了!**_ 今天下午久违的又学了会儿算法,又重新学习了一遍Dijkstra,这是第三次重新学习Dijkstra(*以前学的都忘完了>_<*) ...

  4. 教你用webpack搭一个vue脚手架[超详细讲解和注释!]

    1.适用人群 1.对webpack知识有一定了解但不熟悉的同学. 2.女同学!!!(233333....) 2.目的 在自己对webpack有进一步了解的同时,也希望能帮到一些刚接触webpack的同 ...

  5. 教你用webpack搭一个vue脚手架[超详细讲解和注释!](转载)

    1.适用人群 1.对webpack知识有一定了解但不熟悉的同学. 2.女同学!!!(233333....) 2.目的 在自己对webpack有进一步了解的同时,也希望能帮到一些刚接触webpack的同 ...

  6. vue-cli环境搭建 (超详细保姆级教程)

    一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...

  7. 用 C 语言描述几种排序算法

    排序算法是最基本且重要的一类算法,本文基于 VS2017,使用 C 语言来实现一些基本的排序算法. 一.选择排序 选择排序,先找到数组中最小的元素,然后将这个元素与数组的第一个元素位置互换(如果第一个 ...

  8. C语言8大经典排序算法(1)

    算法一直是编程的基础,而排序算法是学习算法的开始,排序也是数据处理的重要内容.所谓排序是指将一个无序列整理成按非递减顺序排列的有序序列.排列的方法有很多,根据待排序序列的规模以及对数据的处理的要求,可 ...

  9. C语言实现九大排序算法

    C语言实现九大排序算法 直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 基数排序 C语言实现九大排序算法 直接插入排序 将数组分为两个部分,一个是有序部分,一 ...

  10. 贝叶斯个性化排序(BPR)算法小结

    在矩阵分解在协同过滤推荐算法中的应用中,我们讨论过像funkSVD之类的矩阵分解方法如何用于推荐.今天我们讲另一种在实际产品中用的比较多的推荐算法:贝叶斯个性化排序(Bayesian Personal ...

随机推荐

  1. ZOJ 3537 Cake (凸包 + 区间DP && 最优三角形剖分)

    题目链接:Here 题意: 给定 \(n\)​​ 个点的坐标,先问这些点能否组成一个凸包,如是凸包,问用不相交的线来切这个凸包使得凸包只由三角形组成,根据 \(cost_{i, j} = |x_i + ...

  2. 2018年第九届 蓝桥杯C组 C/C++决赛题解

    蓝桥杯历年国赛真题汇总:Here 1.年龄问题 s夫人一向很神秘.这会儿有人问起她的年龄,她想了想说: "20年前,我丈夫的年龄刚好是我的2倍,而现在他的年龄刚好是我的1.5倍". ...

  3. LocalDateTime、LocalDate、Date的相互转换

    1==LocalDateTime 转 LocalDate: 直接调用 toLocalDate() 方法: LocalDateTime localDateTime = LocalDateTime.now ...

  4. 一、Mycat实战---为什么要用mycat

    系列导航 一.Mycat实战---为什么要用mycat 二.Mycat安装 三.mycat实验数据 四.mycat垂直分库 五.mycat水平分库 六.mycat全局自增 七.mycat-ER分片 本 ...

  5. sprint-boot 存储图片的base64

    需求:将前端上传的图片转换成base64码发送到后端存储到数据库中(oracle或者mysql) 问题:当图片大小比较大(大概是超过1M)后端接收到的数据就会有错误. 解决方法:  sprint-bo ...

  6. 【CubeMX】使用 CubeMX 生成对应的配置代码需要设置 “User Label”

    如要生成 SPI 的管脚配置代码,需要设置 User Label,这样工具才能知道应该配置什么,否则不会生成

  7. java - Array 数组反序输出

    通过Array类的静态 sort() 方法可实现对数组排序,sort() 方法提供了许多种重载形式,可对任意类型数组进行升序排序. 然而,Array类中没有类似 js 的 reverse   反序输出 ...

  8. 《OnJava》——11内部类

    内部类 利用内部类,可以将逻辑上存在关联的类组织在一起,而且可以控制一个类在另一个类中的可见性. 内部类和组合不同,内部类是一种代码隐藏机制:将代码放在其他类的内部. 11.1 创建内部类 创建内部类 ...

  9. Redis-逻辑库-select

  10. Go-获取密码的sha值

    // 对用户密码进行加密 func EncodePwd(pwd string) string { s := sha256.New() s.Write([]byte(pwd)) data := s.Su ...