前言

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

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

高质量博客汇总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. 第六届蓝桥杯C++A组 A~F题题解

    蓝桥杯历年国赛真题汇总:Here 1.方格填数 在2行5列的格子中填入1到10的数字. 要求: 相邻的格子中的数,右边的大于左边的,下边的大于上边的. 如[图1.png]所示的2种,就是合格的填法. ...

  2. 二、mysql安装(主从)

    上一篇: 一.mysql5.7 rpm 安装(单机)  https://www.cnblogs.com/yclh/p/14951314.html 环境      192.168.0.1 主节点     ...

  3. C#设计模式11——享元模式的写法

    1. 什么是享元模式? 享元模式是一种结构型设计模式,目的是通过共享对象来尽量减少内存使用和对象数量.它通过将对象分为可共享的和不可共享的来实现这一目的. 2. 为什么要使用享元模式? 使用享元模式可 ...

  4. C#对字符串进行加密解密

    首先上效果图 加解密接口 internal string ToEncrypt(string encryptKey, string str) { try { byte[] P_byte_key = // ...

  5. Jstack 查看线程状态及定位占用 cpu 较高的 java 线程

    本文为博主原创,未经允许不得转载: 1. Jstack 用来查看 java 指定进程所包含的 java 线程状态:    "arthas-NettyHttpTelnetBootstrap-3 ...

  6. C++中不支持strdup(),使用_strdup()

    1.问题 C4996 'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conf ...

  7. Java开发者的Python进修指南:JSON利器之官方json库、demjson和orjson的实用指南

    JSON JSON作为目前最流行的传输格式,在Python中也有相应的实现方式.由于JSON格式的文本可以跨平台并且简单易用,因此被广泛传播.因此,我们今天的主要讨论内容是如何熟练地应用Python的 ...

  8. [转帖]CPU写入512bit要多久:从AVX到NEON

    https://zhuanlan.zhihu.com/p/677124882 写这篇文章的原因是有个项目需要降低延迟,希望能更快地把512bit的数据从内存搬进PCIe设备.原先的做法是软件写寄存器通 ...

  9. [转帖]TiDB Lightning 在数据迁移中的应用与错误处理实践

    TiDB Lightning 在数据迁移中的应用与错误处理实践 作者简介:DBA,会点 MySQL,懂点 TiDB,Python. 个人主页:https://tidb.net/u/seiang/ans ...

  10. [转帖]jmeter无图形界面执行测试并生成报告

    1.进入jmeter的安装目录,找到bin文件夹,进入这个文件执行以下命名 jmeter -n -t test\xxx.jmx -l test\cli0705.jtl -e -o test\resul ...