Go语言实现八大排序|排序算法|超详细保姆级别注释
前言
那么这里博主先安利一些干货满满的专栏了!
首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。
高质量博客汇总
https://blog.csdn.net/yu_cblog/category_12379430.html?spm=1001.2014.3001.5482在进入正题之前,博主想告诉大家,在很久之前,博主出过C++版本的九大排序算法的博客,那里面的算法解释更详细,大家有需要可以通过传送门过去看哦~
http://t.csdn.cn/QnPDg
http://t.csdn.cn/QnPDg当然,这里博主也给大家附上本项目代码的Github链接,需要源代码的伙伴们可以自取。
冒泡排序
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语言实现八大排序|排序算法|超详细保姆级别注释的更多相关文章
- c语言面试宝典(经典,超详细)
c语言面试宝典(经典,超详细) 2018年08月25日 09:32:19 chengxuyuan997 阅读数:7799 摘自:https://blog.csdn.net/chengxuyuan9 ...
- 【优化算法】Greedy Randomized Adaptive Search算法 超详细解析,附代码实现TSP问题求解
01 概述 Greedy Randomized Adaptive Search,贪婪随机自适应搜索(GRAS),是组合优化问题中的多起点元启发式算法,在算法的每次迭代中,主要由两个阶段组成:构造(co ...
- Dijkstra算法——超~~详细!!
Dijkstra算法_ ** 时隔多月,我又回来了!**_ 今天下午久违的又学了会儿算法,又重新学习了一遍Dijkstra,这是第三次重新学习Dijkstra(*以前学的都忘完了>_<*) ...
- 教你用webpack搭一个vue脚手架[超详细讲解和注释!]
1.适用人群 1.对webpack知识有一定了解但不熟悉的同学. 2.女同学!!!(233333....) 2.目的 在自己对webpack有进一步了解的同时,也希望能帮到一些刚接触webpack的同 ...
- 教你用webpack搭一个vue脚手架[超详细讲解和注释!](转载)
1.适用人群 1.对webpack知识有一定了解但不熟悉的同学. 2.女同学!!!(233333....) 2.目的 在自己对webpack有进一步了解的同时,也希望能帮到一些刚接触webpack的同 ...
- vue-cli环境搭建 (超详细保姆级教程)
一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...
- 用 C 语言描述几种排序算法
排序算法是最基本且重要的一类算法,本文基于 VS2017,使用 C 语言来实现一些基本的排序算法. 一.选择排序 选择排序,先找到数组中最小的元素,然后将这个元素与数组的第一个元素位置互换(如果第一个 ...
- C语言8大经典排序算法(1)
算法一直是编程的基础,而排序算法是学习算法的开始,排序也是数据处理的重要内容.所谓排序是指将一个无序列整理成按非递减顺序排列的有序序列.排列的方法有很多,根据待排序序列的规模以及对数据的处理的要求,可 ...
- C语言实现九大排序算法
C语言实现九大排序算法 直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 基数排序 C语言实现九大排序算法 直接插入排序 将数组分为两个部分,一个是有序部分,一 ...
- 贝叶斯个性化排序(BPR)算法小结
在矩阵分解在协同过滤推荐算法中的应用中,我们讨论过像funkSVD之类的矩阵分解方法如何用于推荐.今天我们讲另一种在实际产品中用的比较多的推荐算法:贝叶斯个性化排序(Bayesian Personal ...
随机推荐
- 【每日一题】20.K-th Number (二分 + 尺取)
关于此题,我们分析一下: 一个区间第k大的数不小于x的条件是什么? 答案就是一个区间内不小于x的数的个数不小于k 那么,我们就会发现,我们其实并不需要知道每个数的值,实际上对我们有用的只有每个数与x的 ...
- SpringBoot发布https服务
一.生成SSL证书 1.进入本地jdk的路径 cd D:\Program\jdk1.8.0_77\jre\lib\security cmd窗口生成证书HSoftTiger.keystore到D盘 ke ...
- vue+iviews 动态表格(table组件)
iviews官网上关于table的使用方法是固定表头的使用方法,如何生成动态的table网上找了好多也没有特别合适的,综合几位博主的文章经过尝试终于实现了,分享出来供大家参考 一.先看官网上的样例 官 ...
- eyebeam高级设置
概述 VOIP测试过程中,经常会用到各种各样的SIP终端,eyebeam是其中最常见的一种. 在eyebeam的配置option中,只有少量的配置选项,有些特殊的设置无法配置. 比如DTMF码的发码形 ...
- 开源项目《Elight.MVC-ASP.NET》的研究学习
一 观看效果 将源码下载来后,发现不能直接运行,读了一下md文件,发现还要做自己一些改动. 由于我本机是sqlserver, 所以我改了下 appsetting.json 里要使用的数据库,然后 ...
- 深入理解Kafka核心设计及原理(六):Controller选举机制,分区副本leader选举机制,再均衡机制
转载请注明出处:https://www.cnblogs.com/zjdxr-up/p/15026824.html 目录: 6.1.Kafka核心总控制器Controller 6.2.Controlle ...
- 04 Tcl字符串
Tcl字符串 4.1 Tcl将说有的变量值视作字符串,并将他们作为字符串进行保存. 命令 描述 append 将值追加到字符串尾 binary 二进制化字符串 format 字符串格式化 regexp ...
- 后端开发之光!Django应用的容器化部署实践~
在此之前,我一直用uwsgi+virtualenv+nginx方式进行应用部署,操作起来比较麻烦,而且依赖于服务器上的Python版本,服务的管理方面单纯uwsgi + pid算不上特别麻烦但总没有d ...
- [转帖]【终端使用】"usermod"命令 和 组(包括:主组、附加组)
"usermod"命令,可以用来设置用户账户的 主组.附加组.登录使用的Shell. 命令 作用 usermod -g 组名 用户名 修改用户的主组(gid) usermod ...
- [转帖]jumpserver 添加Windows主机
jump server添加 Windows主机资产 添加Linux主机资产步骤我们可以参照 链接:jump server添加Linux主机资产 进行操作. 一.资产管理-资产列表-创建资产 IP根据自 ...
