go语言实现7大排序算法

VSCode玩转ESP-ADF音频开发:从环境搭建到成功播放MP3的避坑全流程 本文详细介绍了如何在VSCode环境下使用ESP-ADF框架进行ESP32音频开发,从环境搭建到成功播放MP3的全流程。重点解析了`IDF_PATH`和`ADF_PATH`的配置问题,以及如何解决`xTaskCreateRestrictedPinnedToCore`等常见编译错误,帮助开发者快速上手ESP-ADF音频开发。 阅读详情
package main

import (
    "fmt"
    "math/rand"
    "time"
    // "os"
    // "os/signal"
)

const (
    num      = 100000
    rangeNum = 100000
)

func main() {
    randSeed := rand.New(rand.NewSource(time.Now().Unix() + time.Now().UnixNano()))
    var buf []int
    for i := 0; i < num; i++ {
        buf = append(buf, randSeed.Intn(rangeNum))
    }
    t := time.Now()
    //冒泡排序
    // maopao(buf)
    // 选择排序
    // xuanze(buf)
    // 插入排序
    // charu(buf)
    //希尔排序
    // xier(buf)
    //快速排序
    // kuaisu(buf)
    // 归并排序
    // guibing(buf)
    // 堆排序
    duipai(buf)

    // fmt.Println(buf)
    fmt.Println(time.Since(t))

    //等待退出
    // c := make(chan os.Signal, 1)
    // signal.Notify(c, os.Interrupt, os.Kill)
    // <-c
    // fmt.Println("Receive ctrl-c")
}

// 冒泡排序
func maopao(buf []int) {
    times := 0
    for i := 0; i < len(buf)-1; i++ {
        flag := false
        for j := 1; j < len(buf)-i; j++ {
            if buf[j-1] > buf[j] {
                times++
                tmp := buf[j-1]
                buf[j-1] = buf[j]
                buf[j] = tmp
                flag = true
            }
        }
        if !flag {
            break
        }
    }
    fmt.Println("maopao times: ", times)
}

// 选择排序
func xuanze(buf []int) {
    times := 0
    for i := 0; i < len(buf)-1; i++ {
        min := i
        for j := i; j < len(buf); j++ {
            times++
            if buf[min] > buf[j] {
                min = j
            }
        }
        if min != i {
            tmp := buf[i]
            buf[i] = buf[min]
            buf[min] = tmp
        }
    }
    fmt.Println("xuanze times: ", times)
}

// 插入排序
func charu(buf []int) {
    times := 0
    for i := 1; i < len(buf); i++ {
        for j := i; j > 0; j-- {
            if buf[j] < buf[j-1] {
                times++
                tmp := buf[j-1]
                buf[j-1] = buf[j]
                buf[j] = tmp
            } else {
                break
            }
        }
    }
    fmt.Println("charu times: ", times)
}

// 希尔排序
func xier(buf []int) {
    times := 0
    tmp := 0
    length := len(buf)
    incre := length
    // fmt.Println("buf: ", buf)
    for {
        incre /= 2
        for k := 0; k < incre; k++ { //根据增量分为若干子序列
            for i := k + incre; i < length; i += incre {
                for j := i; j > k; j -= incre {
                    // fmt.Println("j: ", j, " data: ", buf[j], " j-incre: ", j-incre, " data: ", buf[j-incre])
                    times++
                    if buf[j] < buf[j-incre] {
                        tmp = buf[j-incre]
                        buf[j-incre] = buf[j]
                        buf[j] = tmp
                    } else {
                        break
                    }
                }
                // fmt.Println("middle: ", buf)
            }
            // fmt.Println("outer: ", buf)
        }
        // fmt.Println("outer outer: ", buf, " incre: ", incre)

        if incre == 1 {
            break
        }
    }
    // fmt.Println("after: ", buf)
    fmt.Println("xier times: ", times)
}

// 快速排序
func kuaisu(buf []int) {
    kuai(buf, 0, len(buf)-1)
}

func kuai(a []int, l, r int) {
    if l >= r {
        return
    }
    i, j, key := l, r, a[l] //选择第一个数为key
    for i < j {
        for i < j && a[j] > key { //从右向左找第一个小于key的值
            j--
        }
        if i < j {
            a[i] = a[j]
            i++
        }

        for i < j && a[i] < key { //从左向右找第一个大于key的值
            i++
        }
        if i < j {
            a[j] = a[i]
            j--
        }
    }
    //i == j
    a[i] = key
    kuai(a, l, i-1)
    kuai(a, i+1, r)
}

//归并排序
func guibing(buf []int) {
    tmp := make([]int, len(buf))
    merge_sort(buf, 0, len(buf)-1, tmp)
}

func merge_sort(a []int, first, last int, tmp []int) {
    if first < last {
        middle := (first + last) / 2
        merge_sort(a, first, middle, tmp)       //左半部分排好序
        merge_sort(a, middle+1, last, tmp)      //右半部分排好序
        mergeArray(a, first, middle, last, tmp) //合并左右部分
    }
}

func mergeArray(a []int, first, middle, end int, tmp []int) {
    // fmt.Printf("mergeArray a: %v, first: %v, middle: %v, end: %v, tmp: %v\n",
    //     a, first, middle, end, tmp)
    i, m, j, n, k := first, middle, middle+1, end, 0
    for i <= m && j <= n {
        if a[i] <= a[j] {
            tmp[k] = a[i]
            k++
            i++
        } else {
            tmp[k] = a[j]
            k++
            j++
        }
    }
    for i <= m {
        tmp[k] = a[i]
        k++
        i++
    }
    for j <= n {
        tmp[k] = a[j]
        k++
        j++
    }

    for ii := 0; ii < k; ii++ {
        a[first+ii] = tmp[ii]
    }
    // fmt.Printf("sort: buf: %v\n", a)
}

// 堆排序
func duipai(buf []int) {
    temp, n := 0, len(buf)

    for i := (n - 1) / 2; i >= 0; i-- {
        MinHeapFixdown(buf, i, n)
    }

    for i := n - 1; i > 0; i-- {
        temp = buf[0]
        buf[0] = buf[i]
        buf[i] = temp
        MinHeapFixdown(buf, 0, i)
    }
}

func MinHeapFixdown(a []int, i, n int) {
    j, temp := 2*i+1, 0
    for j < n {
        if j+1 < n && a[j+1] < a[j] {
            j++
        }

        if a[i] <= a[j] {
            break
        }

        temp = a[i]
        a[i] = a[j]
        a[j] = temp

        i = j
        j = 2*i + 1
    }
}
图文详解秋叶ComfyUI整合包开启密码访问教程(附内网穿透实战经验) ComfyUI密码、ComfyUI-Login、ComfyUI内网穿透、秋叶整合包、ComfyUI安全防护 想远程访问 ComfyUI(跨设备或公网)不希望任何人随意使用或篡改服务需要给 ComfyUI 添加登录验证机制只要按照本文教程,安装插件,并设置好用户名密码,你就能把服务加上一道强力的门槛。📌配合ngrokfrp等内网穿透工具使用公网域名推荐启用 HTTPS(SSL证书可以用宝塔/ZeroSSL 申请)密码可以设置复杂一些,定期更换更安全📬如果你在配置过程中遇到问题,欢迎评论区留言交流,或者私信我,后续我也会更新更多 ComfyUI 插件教程、安全部署经验等内容。 阅读详情

相关推荐

银河麒麟V10 SP3下NFS客户端挂载失败?5个常见问题排查与修复

本文针对银河麒麟V10 SP3系统中NFS客户端挂载失败的常见问题,提供了5个实战排查方案。从基础服务状态检查到防火墙配置、版本兼容性、/etc/fstab设置及权限映射,详细解析了问题根源与解决方案,帮助用户快速恢复NFS文件共享功能。

weixin_42525005的博客 361

go排序算法(五种常用)

常用的排序算法

hezhanglill的博客 1659

ADS1293心电图模块实战:从电极贴片到信号采集的全流程指南

本文提供了一份基于TI ADS1293芯片的心电图采集系统全流程实战指南。文章深入探讨了从电极贴片选择与皮肤预处理、ADS1293前端配置(包括PGA、RLD和威尔逊网络),到PCB布局、电源去耦以及固件滤波与运动伪影处理等关键环节,旨在帮助硬件工程师和嵌入式开发者构建稳定可靠的可穿戴心电监测设备。

weixin_29201313的博客 384

Go语言十大排序算法

文章目录Go语言十大排序算法0x01 冒泡排序0x02 选择排序0x03 插入排序0x04 希尔排序0x05 归并排序 Go语言十大排序算法 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度: 一个算法执行所耗费的时间。 空间复杂度: 运行完一个程序所需内存的大小。 均以升序为例

weixin_42324313的博客 5164

Marin说PCB之LPDDR5的布线注意事项--01

以上就是本期所有内容了,有些是通用的LPDDR5的设计准则,有的是针对单板的设计规则,严格意义说是没有哪一种规则是完全适用的LPDDR5的 通用规则的,不同的单板可能板厚,板材,层数,SOC以及DDR的型号都是不同的,一般的做法就是严格按照SOC手册上的LPDDR5的要求加上仿真同事给的建议修改优化就好了,我们下期文章不见不散。我们知道想要做好一个LPDDR颗粒,需要考虑的是因素有很多例如,电源完整性,信号完整性,层叠的设计,布局的摆放,布线的合理规划,去耦电容的摆放等等。

weixin_45223454的博客 3163

DisplayPort 1.4扰码原理与16位并行LFSR实现

DisplayPort物理层信号完整性依赖于数据扰码技术,其本质是通过线性反馈移位寄存器(LFSR)对传输数据进行伪随机化处理,以改善频谱分布、抑制低频能量堆积、提升时钟恢复能力并降低EMI辐射。该技术广泛应用于高速串行接口如DP、PCIe和USB,核心在于确定性伪随机序列生成与收发端同步。DisplayPort 1.4强制要求符合ANSI X3.230标准的16级LFSR,并在8b/10b编码后执行扰码;而传统串行实现难以满足21.6Gbps速率下的时序约束,必须采用并行展开结构——将16拍移位压缩为单周

weixin_29192211的博客 313

数据结构与算法(四)

第四章 排序算法 1. 常用算法   根据时间复杂度的不同,主流的排序算法可以分为3大类。 1.1 时间复杂度为O(n2)O(n^2)O(n2)的排序算法 冒泡排序 选择排序 插入排序 希尔排序(希尔排序比较特殊,它的性能略优于O(n2)O(n^2)O(n2),但右比不上O(nlogn)O(nlogn)O(nlogn),姑且把它归入本类) 1.2 时间复杂度为O(nlogn)O(nlogn)O(nlogn)的排序算法 快速排序 归并排序 堆排序 1.3 时间复杂度为线性的排序算法 计数排序 桶.

weixin_42410385的博客 459

基于Simulink雷达系统建模仿真(附源码)

此示例显示如何设置由发射器、带目标的信道和接收器组成的雷达系统仿真。一、系统架构该系统包括:雷达脉冲发生器,以 2% 占空比(导通时间 = 2 ms,周期 = 100 ms)输出功率为 1 mW 的啁啾声。RF发射器部分由滤波器和组成,使用RF模块集电路包络库模块实现。由于滤波器是线性器件,放大器是非线性器件,因此它们被分成两个独立的子系统。这种分离允许在每个子系统中使用不同的仿真频率集。这种分离还允许在更快的仿真速度和级联链中可用的级间负载效应损失之间进行权衡。

珞瑜的博客 4581

Go语言排序

对于Go语言来说,主要对两种类型的数据进行排序:① 切片 ② 结构体,切片一般对应基本的数据类型,例如int,float类型的数字,字符串等基本数据类型的切片,对于结构体的排序,类似于python列表嵌套元组(或者是嵌套列表),例如python的列表:a = [(1,2,4),(3,4,2),(5,2,7)],python对列表中的元组排序可以使用python中的sort方法并且利用lambda表达式进行排序,lambda表达式可以自定义按照元组的第几个元祖进行排序:a.sort(key=lambda x:

二哈 3600

c# 如何使用S7NET 读取汇川H5U的数据

本文介绍了两种使用C#读取汇川H5U PLC数据的方法。第一种通过ModbusTCP协议(推荐),使用NModbus库实现,步骤包括配置PLC的Modbus服务器功能、安装库及编写读取保持寄存器的代码。第二种针对兼容西门子S7协议的型号,使用S7NetPlus库直接读取。文章强调需注意地址映射关系、协议配置及网络设置,并建议优先采用ModbusTCP方案以确保稳定性。两种方法均提供了完整的代码示例,帮助开发者快速实现在C#环境下与汇川H5U PLC的通信。

StevenChen的博客 457

2023 ICRA《Visual Language Maps for Robot Navigation》阅读笔记

视觉语言导航可以使用预先训练的现有的视觉语言模型来将图像与对象目标的自然语言描述相匹配,但它与绘制环境的过程仍然脱节,缺乏经典几何地图的空间精度。为了解决这个问题,我们提出了VLMaps,这是一种空间地图表示,它将预训练的视觉语言特征与物理世界的3D重建直接融合在一起。VLMaps可以使用标准探索方法从机器人上的视频馈送中自主构建,并在没有额外标记数据的情况下实现地图的自然语言索引。具体来说,当与大型语言模型(LLM)相结合时,VLMaps可以用于。

qq_44100524的博客 1990

排序算法详解(一)Go

生活中经常有需要我们排序的栗子,比如说成绩排名,按照分数从高到底排序,对绝大多数程序员来说,排序算法可能是学过的第一种算法,但是不同的排序算法是存在差异的,有的算法花费时间很长,有的算法花费空间很多,就好比我们的代码质量,不同的算法得到的程序性能是不一样的。因此我们要学习下优秀的算法,用一种更合适的方式去处理问题。主要是有以下几类指标。指的是在一个算法在最好的情况下的执行效率,比如说要排序的数组刚好是已经有序的,要吃饭的时候刚好外卖到了。当然这是理想状态下,不可强求。指的是在最糟糕的情况下,执行这段代码的时

MClink的博客 364

[VCS]门级仿真及SDF反标

摘要:门级仿真在STA工具普及后仍是验证的重要环节,主要用于检查SDC完备性、异步电路时序、网表完整性及为功耗分析提供波形。门级仿真分为不带时序反标的前仿和带SDF反标的后仿,后仿需加载SDF文件提供精确延时信息。VCS提供多种仿真选项控制时序检查行为,SDF反标可通过命令或系统函数实现。后仿需特别注意关闭notimingcheck选项以确保时序检查有效性,并建议检查SDF反标报告和波形验证延时一致性。

元直的博客 9790

Learning Golang算法实战:10大经典排序算法的Go语言实现与优化

在计算机科学领域,排序算法是数据处理的基础。本文将带您深入探索使用Go语言实现的10大经典排序算法,包括它们的原理、实现代码以及优化技巧。无论您是刚入门的Go开发者还是有经验的程序员,这篇文章都能帮助您掌握排序算法的核心概念和Go语言实现方式。 ## 为什么选择Go语言实现排序算法? Go语言以其简洁、高效和并发特性而闻名,非常适合实现各种算法。其内置的切片(slice)类型和丰富的标准库为排

gitblog_00524的博客 614

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

go语言十大排序算法总结

选择排序选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置已经是正确的了。 选择排序是不稳定的。算法复杂度是O(n ^2 )。package mainimport ( "fmt" )type SortInterface interface { sort() } type Sorto

guoer9973的专栏 9022

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Golang实现常见排序算法

// 1、冒泡排序 func BubbleSort(arr []int) { n := len(arr) flag := true for i := 0; i < n && flag; i++ { flag = false for j := 0; j < n-i-1; j++ { if arr[j] > arr[j+1] { arr[j], arr[j+1] = arr[j+1], arr[j] flag = true } }.

hello_wcx的博客 1411

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Golang 实现冒泡排序

Golang 实现冒泡排序 本文实现冒泡排序,充分利用Go语言特性。 1. 冒泡排序 冒泡排序循环集合n次的排序算法,每次遍历一次集合。其检查第一个元素和第二个元素,如果第一个大于第二个则交换它们,整个过程重复执行该动作。 该算法时间复杂度为O(n*n),n为待排序元素个数,最坏情况是下面示例: [9,8,7,6,5,4,3,2,1,0] 对于完全是逆序数组,冒泡排序需要迭代10次。最好场景是O(n), 在这之间可考虑优化,第一次迭代之后,最大的已经排好序,下次就可以不比较它;这样每次遍历之后总长度就少一

neweastsun的专栏 1572

Go语言将引入新型排序算法:pdqsort

哈喽,大家好,我是asong。最近在逛Go仓库时看到了一个commit是关于排序算法的,即pdqsort排序算法,Go计划将在下一个版本中支持该排序算法,下面我们就具体来看一看这个事情;commit地址:https://github.com/golang/go/commit/72e77a7f41bbf45d466119444307fd3ae996e257该commit中介...

Seekload 488

Go语言实现几种常见的排序算法

前面已经介绍golang基本的语法和容器了,这一篇文章用golang实现四种排序算法,快速排序,插入排序,选择排序,冒泡排序。既可以总结前文的基础知识,又可以熟悉下golang如何实现这四种排序。 快速排序 算法介绍: 假设用户输入了如下数组: 下标 | 0 | 1 | 2 | 3 | 4 | 5 | 数值 | 6 | 2 | 7 | 3 | 8 | 9 | 创建变量i=0(指向第一个数据), j=5(指向最后一个数据), k=6(赋值为第一个数据的值) 我们要把所有比k小的数移动到k的左面,所以我们可以

weixin_44575411的博客 627

Go 将在下个版本支持新型排序算法:pdqsort

pdqsort是Pattern-defeating quicksort的缩写,是一种新型的排序算法

优快云资讯 7952

排序算法(golang实现)

排序算法

2301_79890350的博客 745

用Go语言 实现快速排序 (Golang经典编程案例)

选择排序,代码如下: package main import ( "fmt" ) //left 表示 数组左边的下标,right 表示数组右边的下标,array 表示要排序的数组 func QuickSort(left int, right int, array *[7]int) { l := left r := right // pivot 是中轴, 支点 pivot := arr...

数据知道的博客 3万+

go实现选择排序算法

前面我们讲解了选择排序算法,现在我们用go语言实现 代码如下 package main import "fmt" //选择排序 func selectSort(theArray[] int)[]int{ for i := 0; i&lt;len(theArray); i++ { for j :=i; j&lt;len(theArray); j++ { if theArray...

美丽的泡沫 737

Go语言学习笔记【16】 排序算法之计数排序、算法总结

go语言实现计数排序,十大排序算法比较和总结

LC520730的博客 516

Go 实现选择排序算法及优化

本文分享的内容是使用 Go 实现选择排序算法。算法包含普通算法和优化后的算法。优化后的算法减少了一半的交换次数。

cmy_top的博客 597

Data-Structures-and-Algorithms项目排序算法完全解析:7大排序算法实现原理

想要快速掌握Go语言中的排序算法实现吗?Data-Structures-and-Algorithms项目提供了7种经典排序算法的简洁实现,是学习数据结构与算法的绝佳资源。这个开源项目采用Go语言编写,代码清晰易懂,特别适合算法初学者和想要深入理解排序原理的开发者。 ## 🎯 项目核心排序算法概览 Data-Structures-and-Algorithms项目包含了从基础到高级的多种排序算法

gitblog_01179的博客 445
上一篇: Golang操作数据库
下一篇: 怎样计算大文件的MD5
QQ7650371
博客等级 码龄11年 164粉丝 192原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值