golang 冒泡、选择、插入、快速排序法

news2024/11/22 19:18:46

个人学习笔记~

1. 冒泡排序

// @Author sunwenbo
// 2024/4/6 22:37
/*
1. 一共会经过arr.length -1 次的轮数比较,每一轮将会确认一个数的位置
2. 每一轮的比较次数逐渐的减少 [4,3,2,1]
3. 当发现前面的一个数比后面的一个数大的时候,就进行了交换
*/

package main

import "fmt"

func bubbleSort(arr1 *[11]int) {
	fmt.Println("排序前arr=", (*arr1))
	//完成第一轮排序
	temp := 0 //临时变量 用作于交换
	for i := 0; i < len(arr1); i++ {
		for j := 0; j < len(arr1)-1; j++ {
			if (*arr1)[j] > (*arr1)[j+1] {
				temp = (*arr1)[j]
				(*arr1)[j] = (*arr1)[j+1]
				(*arr1)[j+1] = temp
			}
		}
	}

}

func main() {
	arr := [...]int{1, 4, 3, 11, 6, 8, 2, 9, 0, 5, 7}
	//外层控制行
	for i := 0; i < len(arr)-1; i++ {
		//内层控制列
		for j := 0; j < len(arr)-1; j++ {
			//比较两个相邻的元素 满足条件交换数据
			//升序使用大于号, 降序使用小于号
			if arr[j] > arr[j+1] {
				arr[j], arr[j+1] = arr[j+1], arr[j]
			}
		}
	}
	fmt.Println(arr)
	arr1 := [11]int{1, 4, 3, 11, 6, 8, 2, 9, 0, 5, 7}
	bubbleSort(&arr1)
	fmt.Println("排序后的arr1=", arr1)
}

2. 选择排序

// @Author sunwenbo
// 2024/4/6 21:49
package main

import "fmt"

/*
选择排序基本介绍
	选择式排序也属于内部排序法,是从预排序的数据中按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序的目的
*/

func selectSort(arr *[6]int) {
	for j := 0; j < len(arr)-1; j++ {
		min := arr[j]
		minIndex := j
		for i := j + 1; i < len(arr); i++ {
			if min > arr[i] {
				min = arr[i]
				minIndex = i
			}
		}
		if minIndex != j {
			arr[minIndex], arr[j] = arr[j], arr[minIndex]
		}
	}
}

func main() {
	// 定义数组,从小到大排
	arr := [6]int{10, 34, 19, 100, 80, 99}
	selectSort(&arr)
	fmt.Println("main函数")
	fmt.Println(arr)
}

3. 插入排序 

// @Author sunwenbo
// 2024/4/7 18:37
package main

import "fmt"

/*
插入排序法介绍:
	插入式排序属于内部排序法,是对预排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的

插入排序(insertion Sorting)的基本思想是:把N个待排序的元素堪称一个有序表和一个无序表,开始时有序表中包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中第一个元素,把它的排序码
依次与有序表元素的排序码进行比较,将它插入到有序表中的适当为止,使之成为新的有序表
*/

func InsertSort(arr *[7]int) {
	for i := 1; i < len(arr); i++ {
		// 完成第一次,给第二个元素找到合适的位置并插入
		insertVal := arr[i]
		insertIndex := i - 1 //下标

		// 从大到小
		for insertIndex >= 0 && arr[insertIndex] < insertVal {
			arr[insertIndex+1] = arr[insertIndex] // 数据后移
			insertIndex--
		}

		// 插入
		if insertIndex+1 != i {
			arr[insertIndex+1] = insertVal
		}
		fmt.Printf("第%d次插入后 %v \n", i, *arr)
	}
}

func main() {
	arr := [7]int{23, 0, 12, 56, 34, -1, 55}
	fmt.Println("原始数组=", arr)
	InsertSort(&arr)
	fmt.Println("main函数")
	fmt.Println(arr)
}

 4. 快速排序

// @Author sunwenbo
// 2024/4/8 11:26
package main

import "fmt"

/*
快速排序法介绍:
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都要比另外一部分的数据都要小,
然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据编程有序序列
*/
// 快速排序
// 1. left表示数组左边的下标
// 2. right 表示数组右边的下标
// 3. array 表示要排序的数组

func QuickSort(left int, right int, array *[6]int) {
	l := left
	r := right
	// pivot是中轴,支点
	pivot := array[(left+right)/2]
	temp := 0
	// for 循环的目标是将比pivot小的数放到左边,大的数放到右边
	for l < r {
		// 先从pivot 的左边找到大于等于pivot的值
		for array[l] < pivot {
			l++
		}
		// 从pivot的右边找到小于等于pivot的值
		for array[r] > pivot {
			r--
		}
		// l >= r 表明本次分解任务完成
		if l >= r {
			break
		}
		// 交换
		temp = array[l]
		array[l] = array[r]
		array[r] = temp

		// 优化
		if array[l] == pivot {
			r--
		}
		if array[r] == pivot {
			l++
		}
	}
	// 如果l==r,再移动一位就不要比较了
	if l == r {
		l++
		r--
	}
	// 向左递归
	if left < r {
		QuickSort(left, r, array)
	}
	// 向右递归
	if right > l {
		QuickSort(l, right, array)
	}
}

func main() {
	arr := [6]int{-9, 78, 0, 23, -567, 70}
	// 调用快速排序
	QuickSort(0, len(arr)-1, &arr)
	fmt.Println("第一种方法排序后的数组:", arr)

	fmt.Println("###################")

	arr2 := []int{10, 7, 8, 9, 1, 5}
	n := len(arr2)
	quickSort(arr2, 0, n-1)
	fmt.Println("第二种方法排序后的数组:", arr2)
}

// 快速排序函数
func quickSort(arr []int, low, high int) {
	if low < high {
		// 划分
		pivot := partition(arr, low, high)
		// 递归排序左右子数组
		quickSort(arr, low, pivot-1)
		quickSort(arr, pivot+1, high)
	}
}

// 划分函数
func partition(arr []int, low, high int) int {
	pivot := arr[high] // 选择最后一个元素作为基准值
	i := low - 1       // i 为小于基准值的最后一个元素的索引

	for j := low; j < high; j++ {
		if arr[j] < pivot {
			i++
			// 将小于基准值的元素放到左边
			arr[i], arr[j] = arr[j], arr[i]
		}
	}
	// 将基准值放到正确的位置上
	arr[i+1], arr[high] = arr[high], arr[i+1]
	return i + 1
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kubectl_入门_Pod配置以及生命周期

Pod配置以及生命周期 1. Pod结构定义 每个pod中都可以包含一个或多个容器&#xff0c;这些容器可以分为两类 用户程序所在的容器&#xff0c;数量可多可少Pause容器&#xff0c;这是每个Pod都会有的一个根容器&#xff0c;它的作用有两个 可以以它为根据&#xff0c;评估整个…

参与 PenPad Season 2 获得勋章,还有海量 Scroll 生态稀缺权益

PenPad是Scroll生态中的首个LaunchPad平台&#xff0c;该平台继承了Scroll生态的技术优势&#xff0c;具备包括隐私在内的系列特点&#xff0c;同时且也被认为是Scroll生态最重要的价值入口之一。Penpad与Scroll官方始终保持着合作&#xff0c;同时该项目自启动以来长期得到Scr…

宁盾radius认证服务器软件如何实现802.1X认证/Portal认证上网(portal web入网认证)

一、什么是802.1X认证和Portal认证以及有什么区别 随着企业网络规模的不断扩大和网络安全威胁的日益加剧&#xff0c;有效的网络认证机制成为保障网络安全的关键。其中&#xff0c;802.1X认证和Portal认证是两种常见的网络认证方式&#xff0c;它们各有特点&#xff0c;适用于…

MySQL高可用搭建方案MHA

MHA架构介绍 MHA是Master High Availability的缩写&#xff0c;它是目前MySQL高可用方面的一个相对成熟的解决方案&#xff0c;其核心是使用perl语言编写的一组脚本&#xff0c;是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中&am…

Xshell配置跳板机访问

文章目录 需求连接主机A配置连接主机B配置Xftp 需求 本机需要访问内网主机B&#xff0c;本机目前只能访问主机A&#xff0c;主机A能够访问主机B 思路&#xff1a;主机A作为跳板机&#xff08;代理&#xff09;访问主机B 工具&#xff1a;Xshell&#xff0c;Xftp 前提 你需要…

服务器安装完SqlServer远程电脑连接不了

1、将服务器的TCP/IP启用 2、重新启动服务 cmd输入services.msc

[从零开始学习Redis | 第九篇] 深入了解Redis数据类型

前言&#xff1a; 在现代软件开发中&#xff0c;数据存储和处理是至关重要的一环。为了高效地管理数据&#xff0c;并实现快速的读写操作&#xff0c;各种数据库技术应运而生。其中&#xff0c;Redis作为一种高性能的内存数据库&#xff0c;广泛应用于缓存、会话存储、消息队列…

openGauss_5.1.0 企业版快速安装及数据库连接:单节点容器化安装

目录 &#x1f4da;第一章 官网信息&#x1f4da;第二章 安装&#x1f4d7;下载源码&#x1f4d7;下载安装包&#x1f4d7;修改版本&#x1f4d7;解压安装包&#x1f4d7;运行buildDockerImage.sh脚本&#x1f4d7;docker操作&#x1f4d5;查看docker镜像&#x1f4d5;启动dock…

面试算法-164-K 个一组翻转链表

题目 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内…

【会员单位】泰州玉安环境工程有限公司

中华环保联合会理事单位 水环境治理专业委员会副主任委员单位 我会为会员单位提供服务&#xff1a; 1、企业宣传与技术项目对接&#xff1b; 2、企业标准、行业标准制定&#xff1b; 3、院士专家指导与人才培训 4、国际与国内会议交流 5、专精特新、小巨人等申报认证 6…

Linux-docker安装数据库redis

1.拉取redis镜像 docker pull redis # 下载最新的redis版本 docker pull redis:版本号 # 下载指定的redis版本ps&#xff1a;我这是已经下载最新版本的redis 2.查看redis镜像 docker images3.创建挂在路径并授权 mkdir -p /usr/local/redis/data mkdir -p /usr/local…

微软Office吊打WPS ?不一定,WPS未来被它“拿捏”了

微软Office Plus吊打WPS Office&#xff1f; 微软的Office套件在全球范围内内享有盛誉&#xff0c;其强大的功能和广泛的应用场景使其在办公、娱乐乃至生活的各个角落都显得不可或缺。 而与之相对&#xff0c;WPS Office作为国内办公软件的佼佼者&#xff0c;与微软的较量已历…

python|reset_index

reset_index可以重置索引index&#xff0c;比如说将A、B、C删除一列后&#xff0c;重置成数字。

【LAMMPS学习】八、基础知识(1.4)多副本模拟

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

P8786 [蓝桥杯 2022 省 B] 李白打酒加强版

【dfs题解】---只有50分 (头一回自己用dfs做出来了dp的hard等级的大题&#xff0c;从来没有拿50分这么高兴过哈哈哈哈哈) #include <bits/stdc.h> using namespace std; int n,m; long long ans0; const long long mol1e97; void dfs(int h,int d,int sum) {if(h<0|…

【数据结构】稀疏矩阵的快速转置

【数据结构】稀疏矩阵的转置&#xff08;普通转置 和 快速转置&#xff09; 目录 【数据结构】稀疏矩阵的转置&#xff08;普通转置 和 快速转置&#xff09;三元表稀疏矩阵的转置方法一&#xff08;普通转置&#xff09;复杂度为O(T.muT.nu)方法二&#xff1a;快速转置 复杂度…

Socks5代理IP如何使用?详细教程解析

当我们在互联网上浏览网页、下载文件或者进行在线活动时&#xff0c;隐私和安全问题常常被提及。在这样的环境下&#xff0c;一个有效的解决方案是使用Sock5IP。本教程将向您介绍Sock5IP的使用方法&#xff0c;帮助您保护个人隐私并提升网络安全。 一、什么是Sock5IP&#xff1…

重看Spring聚焦ApplicationContext分析

一、理解下ApplicationContext的设计 &#xff08;一&#xff09;功能性的理解 ApplicationContext 提供了一个轻量级、灵活、可扩展的容器&#xff0c;能帮助我们更加轻松地构建和管理复杂的应用程序&#xff0c;其通过依赖注入和控制反转等技术&#xff0c;降低了组件之间的…

2024年第五届计算机视觉与信息技术国际会议(CVIT 2024)即将召开!

2024年第五届计算机视觉与信息技术国际会议&#xff08;CVIT 2024&#xff09;将于2024年8月16-18日在北京举行。CVIT 2024由北方工业大学主办&#xff0c;国内外的专家学者将齐聚一堂&#xff0c;共同分享最新的技术突破、研究方法和应用案例&#xff0c;共同推动计算机视觉与…

LeetCode-62. 不同路径【数学 动态规划 组合数学】

LeetCode-62. 不同路径【数学 动态规划 组合数学】 题目描述&#xff1a;解题思路一&#xff1a;动态规划&#xff0c;动规五部曲解题思路二&#xff1a;动态规划&#xff08;版本二&#xff09;解题思路三&#xff1a;数论 题目描述&#xff1a; 一个机器人位于一个 m x n 网…