package mainimport "fmt"func main() {Bubble_Sort()Select_Sort()Insert_Sort()Shell_Sort()Heap_Sort()Merge_Sort()Quick_Sort()
}

一、

1、冒泡排序 

// 冒泡排序
func Bubble_Sort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}// 正向冒泡for i := 0; i < len(str)-1; i++ {for j := 1; j <= len(str)-1; j++ {if str[j-1] > str[j] {str[j-1], str[j] = str[j], str[j-1]}}}// 反向冒泡for i := 0; i < len(str)-1; i++ {for j := len(str) - 1; j > i; j-- {if str[j-1] > str[j] {str[j-1], str[j] = str[j], str[j-1]}}}//改进for i := 0; i < len(str)-1; i++ {flag := falsefor j := 1; j <= len(str)-1; j++ {if str[j-1] > str[j] {str[j-1], str[j] = str[j], str[j-1]flag = true}}if !flag {break}}fmt.Println(str)
}

2、快速排序

func Quick_Sort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}Quicking_Sort(str, 0, 8)fmt.Println(str)
}
func Quicking_Sort(str []int, low, high int) {if low < high {pivot := Partition_1(str, low, high)Quicking_Sort(str, low, pivot-1)Quicking_Sort(str, pivot+1, high)}
}func Partition_0(str []int, low, high int) int {//选取基准点。也可以从三个数或者九个数中选取大小为中间值的数作为基准pivotkey := str[low]for low < high { //从表的两端交替向中间扫描for low < high && str[high] > pivotkey {high--}//1、交换法//str[low], str[high] = str[high], str[low]for low < high && str[low] < pivotkey {low++}//1、交换法//str[low], str[high] = str[high], str[low]//2、统一交换str[low], str[high] = str[high], str[low]}return low
}func Partition_1(str []int, low, high int) int {//选取基准点。也可以从三个数或者九个数中选取大小为中间值的数作为基准pivotkey := str[low]temp := pivotkeyfor low < high { //从表的两端交替向中间扫描for low < high && str[high] > pivotkey {high--}//替换法str[low] = str[high]for low < high && str[low] < pivotkey {low++}//替换法str[high] = str[low]}str[low] = tempreturn low
}func Partition_2(str []int, low, high int) int {pivotkey := str[high] // 选择最后一个元素作为基准值i := lowfor j := low; j < high; j++ {// 将比 pivot 小的数丢到 [l...i-1] 中,剩下的 [i...j] 区间都是比 pivot 大的if str[j] < pivotkey {// 互换 i、j 下标对应数据str[i], str[j] = str[j], str[i]// 将 i 下标后移一位i++}}// 最后将 pivot 与 i 下标对应数据值互换// 这样一来,pivot 就位于当前数据序列中间,i 也就是 pivot 值对应的下标str[i], str[high] = pivotkey, str[i]// 返回 i 作为 pivot 分区位置return i
}

二、

1、选择排序 

// 选择排序
func Select_Sort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}for i := 0; i < len(str)-1; i++ {// 未排序区间最小值初始化为第一个元素min := i// 从未排序区间第二个元素开始遍历,直到找到最小值for j := i + 1; j <= len(str)-1; j++ {if str[min] > str[j] {min = j}}// 将最小值与未排序区间第一个元素互换位置(等价于放到已排序区间最后一个位置)if min != i {str[min], str[i] = str[i], str[min]}}fmt.Println(str)
}

2、堆排序  

//堆排序
func Heap_Sort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}//构建一个大顶堆for i := len(str) / 2; i > 0; i-- {Heap_Adjust_2(str, len(str), i)}for i := len(str) - 1; i > 0; i-- {str[0], str[i] = str[i], str[0]Heap_Adjust_2(str, i, 0) //将剩余的重新调整为大顶堆}fmt.Println(str)
}//堆调整函数0
func Heap_Adjust_0(str []int, length, index int) {temp := str[index]for j := 2*index + 1; j <= length-1; j *= 2 { //沿关键字较大的孩子节点向下筛选if j < length-1 && str[j] < str[j+1] {j++ //j记录孩子节点较大的下标}if temp > str[j] { //父节点大于孩子节点break}str[index] = str[j] //给节点赋值index = j           //index此时已代表孩子节点下标}str[index] = temp //给孩子节点赋值,到此代表节点的值跟孩子节点中的较大值进行互换完成}//堆调整函数1
func Heap_Adjust_1(str []int, length, index int) {parent := indexchild := parent*2 + 1for ; child <= length-1; child *= 2 {if child < length-1 && str[child+1] > str[child] {child++}if str[child] > str[parent] {str[child], str[parent] = str[parent], str[child]parent = child}}
}//堆调整函数2
func Heap_Adjust_2(str []int, length, index int) {largest := index     // 初始化最大元素为根节点left := 2*index + 1  // 左子节点索引right := 2*index + 2 // 右子节点索引// 如果左子节点大于根节点if left < length && str[left] > str[largest] {largest = left}// 如果右子节点大于最大元素if right < length && str[right] > str[largest] {largest = right}// 如果最大元素不是根节点if largest != index {str[index], str[largest] = str[largest], str[index]// 递归调整受影响的子树Heap_Adjust_2(str, length, largest)}
}

三、

1、插入排序

//插入排序
func Insert_Sort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}for i := 1; i <= len(str)-1; i++ {temp := str[i]j := i - 1for ; j >= 0 && str[j] > temp; j-- {str[j+1] = str[j]}str[j+1] = temp}fmt.Println(str)
}

2、希尔排序

//希尔排序   与插入排序比较,把原来按顺序变成了相隔增量
func Shell_Sort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}//increment相隔数量// for increment := len(str) / 3; increment > 0; increment /= 3 {increment := len(str)for increment > 0 {increment = increment / 3//此过程类似于插入排序的过程for i := increment; i <= len(str)-1; i++ {key := str[i]j := i - increment//按照increment,数组从j到0进行交换比较for ; j >= 0 && str[j] > key; j -= increment {str[j+increment] = str[j]}//如果是从for循环走到这里,此时j<0,因为for循环走完时j-=increment ,所以要加回来//走到这里时,j已经减掉increment 了,所以要加回来str[j+increment] = key}}fmt.Println(str)
}

四、归并排序 

// 归并排序
func Merge_Sort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}str = Merging_Sort(str)fmt.Println(str)
}
func Merging_Sort(str []int) []int {// str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}if len(str) <= 1 {return str}mid := len(str) / 2 //获取分区位置//进行递归分区left := Merging_Sort(str[:mid])right := Merging_Sort(str[mid:])res := Merge_0(left, right) //函数将两个有序数组合并成一个有序数组return res
}func Merge_0(left, right []int) []int {// 用于存放结果集result := make([]int, len(left)+len(right))i, j, k := 0, 0, 0for ; k < len(result); k++ {// 任何一个区间遍历完,则退出if i >= len(left) || j >= len(right) {break}// 对所有区间数据进行排序if left[i] < right[j] {result[k] = left[i]i++} else {result[k] = right[j]j++}}// 如果左侧区间还没有遍历完,将剩余数据放到结果集if i <= len(left) {for l := 0; l < len(left)-i; l++ {result[k+l] = left[i+l]}}// 如果右侧区间还没有遍历完,将剩余数据放到结果集if j <= len(right) {for l := 0; l < len(right)-j; l++ {result[k+l] = right[j+l]}}return result
}func Merge_1(left, right []int) []int {result := make([]int, len(left)+len(right))i, j := 0, 0for k := 0; k < len(result); k++ {if i >= len(left) {result[k] = right[j]j++} else if j >= len(right) {result[k] = left[i]i++} else if left[i] < right[j] {result[k] = left[i]i++} else {result[k] = right[j]j++}}return result
}func Merge_2(left, right []int) []int {// result := make([]int, len(left)+len(right))//此处不能用make初始化[]int切片,//因为make初始化后,result=[]int{0,0,0},再用append,result=[]int{0,0,0,5},//相当于直接在result后面添加数据,会导致结果多了很多0var result []intfor len(left) > 0 || len(right) > 0 {if len(left) == 0 {return append(result, right...)}if len(right) == 0 {return append(result, left...)}if left[0] < right[0] {result = append(result, left[0])left = left[1:]} else {result = append(result, right[0])right = right[1:]}}return result
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93188.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93188.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/93188.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Petalinux生成文件的关系

1. 生成文件概述BOOT.BIN是引导程序&#xff0c;包括了 u-boot.elf是build u-boot生成的zynq_fsbl.elf&#xff08;引导PS和PL的启动&#xff09;elf文件是和启动引导相关的文件image.ub是镜像文件roofs.cpio.gz用来构建根文件系统

MongoDB的操作

在 Java 中操作 MongoDB 的 增删改查&#xff08;CRUD&#xff09; 主要有两种方式&#xff1a; Spring Data MongoDB&#xff08;推荐&#xff0c;类似 JPA 风格&#xff09;MongoDB Java Driver&#xff08;原生 API&#xff0c;更灵活&#xff09;1. Spring Data MongoDB 方…

getConnectionOwnerUid

在Android系统中&#xff0c;为了进行网络权限控制、流量统计等&#xff0c;需要将网络连接&#xff08;如Socket&#xff09;与发起该连接的应用UID关联起来。这种关联通常在内核中建立&#xff0c;并在用户空间通过一些接口进行查询。 1. 内核中的实现基础 Linux内核中&#…

开源 Arkts 鸿蒙应用 开发(十)通讯--Http数据传输

文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发&#xff0c;公司安排开发app&#xff0c;临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 Arkts …

net8.0一键创建支持(RabbitMQ)

Necore项目生成器 - 在线创建Necore模板项目 | 一键下载 RabbitMQController.cs using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using RabbitMQ.Client; using RabbitMQ.Client.Events; using System.Text; using System.Threading.Tasks; using UnT.Tem…

Rust 泛型与特性

Rust 泛型与特性 引言 Rust 语言以其安全性和高效性在编程语言中独树一帜。Rust 的泛型和特性是其核心特性之一,它们使得开发者能够编写更加通用、灵活且安全的代码。本文将深入探讨 Rust 中的泛型和特性,包括其概念、用法以及在实际开发中的应用。 泛型简介 概念 泛型是…

LangChain学习——结构化输出和数据解析

LangChain 本指南全面介绍LangChain中结构化输出生成和数据解析的核心功能&#xff0c;包括Pydantic BaseModel构造、各种输出解析器的使用&#xff0c;以及高级错误处理机制。 详细测试样例和代码可参考如下两个链接&#xff1a; test_output_parserstest_pydantic_base_mo…

基于华为ENSP的BGP的状态机深入浅出

本篇技术博文摘要 &#x1f31f; 本文章主要探讨BGP状态机如何控制BGP连接的建立与维护&#xff0c;以及BGP协议在运行过程中如何交换路由信息并确保网络的稳定性 引言 &#x1f4d8; 在这个快速发展的技术时代&#xff0c;与时俱进是每个IT人的必修课。我是肾透侧视攻城狮&…

Android 15中的16KB大页有何优势?

deepseek回答&#xff1a; Android 15引入的16KB大内存页是系统性能优化的关键变革&#xff0c;其核心优势体现在以下方面&#xff1a; ⚡ 一、性能全面提升 系统整体加速 配置16KB页面的设备整体性能提升5%-10%&#xff0c;通过减少内存管理开销释放更多资源用于应用运行。…

Gis数据的A*算法规划航线

1.1 用到的技术栈geotools JTSJgrapht1.2 实现思路// 定义栅格网格参数private static final double CELL_SIZE_DEGREES 0.005;private static int gridWidth 0;//格子高度 index 1private static int gridHeight 0;//格子宽度// 1. 读取GeoJSON文件File geoJsonFile new …

Spring Boot 默认使用 CGLIB,但CGLIB 无法代理 final 类或 final 方法

那么当这两件事冲突时&#xff0c;Spring Boot 是怎么“解决”的呢&#xff1f;答案是&#xff1a;它不解决&#xff0c;也无法解决。当这种情况发生时&#xff0c;你的应用程序会直接启动失败。这不是 Spring Boot 的疏忽&#xff0c;而是由 CGLIB 的底层原理和 Java 语言的规…

cuda编程笔记(10)--memory access 优化

全局内存访问优化&#xff08;Coalesced Access&#xff09; 什么是 Coalesced Access&#xff1f; 定义&#xff1a;一个 warp&#xff08;32 个线程&#xff09;在同一指令中访问全局内存时&#xff0c;如果这些访问请求可以合并成尽可能少的内存事务&#xff08;通常是 32…

闲庭信步使用图像验证平台加速FPGA的开发:第三十一课——车牌识别的FPGA实现(3)车牌字符分割预处理

&#xff08;本系列只需要modelsim即可完成数字图像的处理&#xff0c;每个工程都搭建了全自动化的仿真环境&#xff0c;只需要双击top_tb.bat文件就可以完成整个的仿真&#xff0c;大大降低了初学者的门槛&#xff01;&#xff01;&#xff01;&#xff01;如需要该系列的工程…

电子电气架构 --- 汽车软件全生命周期

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

力扣面试150(41/150)

7.25 56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 我的思路&#xff1a; 左端点升序…

【隧道篇 / IPsec】(7.6) ❀ 01. 利用向导快速建立IPsec安全隧道 (点对点) ❀ FortiGate 防火墙

【简介】相信很多人已经习惯利用导向快速创建VPN了&#xff0c;而且已经有部分尝鲜者已经用上了FortiOS 7.6&#xff0c;但是会发现FortiOS 7.6下的VPN向导改变了很多&#xff0c;一时无法下手&#xff0c;下面我们来看看最常见的点对点是如何配置的。环境介绍在配置IPsec VPN之…

PLLIP核

。1 号红色框内的速度等级代表着设备的速度 等级&#xff0c;保存默认就好&#xff1b;2 号红色框内设置输入频率&#xff1b;3 号红色框选择 PLL 的工作模式。我们 开发板用的晶振是 50MHz 的&#xff0c;故在 2 号红色框内我们填写 50MHz&#xff1b;我们在 3 号红色框内选正…

1.1 Deep learning?pytorch ?深度学习训练出来的模型通常有效但无法解释合理性? 如何 解释?

DL 是什么&#xff0c;你如何理解DL模型&#xff1f; DL 对于我而言&#xff0c;就是人类试图想通过数学语言描述人类学习过程的一门技术&#xff0c;或者说学科。 因此 DL 模型 相当于 数学 的 一个 funciton &#xff0c;有输入&#xff0c;通过function处理&#xff0c;得…

java实现在工具类中注入其他对象方式

方案1&#xff1a; Slf4j Component public class ChatdocApiClient {Value("${chatdoc.app-id}")private String appId;Value("${chatdoc.secret}")private String secret;Value("${chatdoc.domain}")private String domain;private final Rest…

electron中IPC 渲染进程与主进程通信方法解析

electron中ipcRenderer.invoke、ipcRenderer.on、ipcRenderer.send、ipcRenderer.sendSync作用与区别 IPC 渲染进程与主进程通信方法解析 ipcRenderer 的这几个方法作用不完全相同&#xff0c;它们适用于不同的通信场景&#xff0c;核心区别在于通信方向、是否需要响应以及同步…