golang实现四种排序(快速,冒泡,插入,选择)
本文系转载
原文地址:
http://www.limerence2017.com/2019/06/29/golang07/
前面已经介绍golang基本的语法和容器了,这一篇文章用golang实现四种排序算法,快速排序,插入排序,选择排序,冒泡排序。既可以总结前文的基础知识,又可以熟悉下golang如何实现这四种排序。
快速排序
算法介绍
假设用户输入了如下数组
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
数值 | 6 | 2 | 7 | 3 | 8 | 9 |
创建变量i=0(指向第一个数据), j=5(指向最后一个数据), k=6(赋值为第一个数据的值)
我们要把所有比k小的数移动到k的左面,所以我们可以开始寻找比6小的数,从j开始,从右往左找,不断递减变量j的值,我们找到第一个下标3的数据比6小,于是把数据3移到下标0的位置,把下标0的数据6移到下标3,完成第一次比较
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
数值 | 3 | 2 | 7 | 6 | 8 | 9 |
i=0 j=3 k=6
接着,开始第二次比较,这次要变成找比k大的了,而且要从前往后找了。递加变量i,发现下标2的数据是第一个比k大的,于是用下标2的数据7和j指向的下标3的数据的6做交换,数据状态变成下表:
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
数值 | 3 | 2 | 6 | 7 | 8 | 9 |
i=2,j=3,k=6
接下来继续重复上边的步骤,从j开始,从右往左找比k小的,此时i=2,j=3,j再移动一位就和i相等了,此时就完成了k=6的排序,此时k=6,i和j相等都为2,6右边的数都比6大,6左边的数比6小。
接下来分别比较6左边的序列(下标从0到1)和6右边(下标从3到5)的序列,同样采用上述办法,直到所有序列都比较完成。
算法实现
1 |
func quickSort(slice []int, begin int, end int) { |
插入排序
算法描述
假设用户输入了如下数组
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
数值 | 6 | 2 | 7 | 3 | 8 | 9 |
假设从小到大排序
插入排序先从下标为1的元素2开始,比较前边下标为0的元素6,2比6小,则将6移动到2的位置,2放到6的位置
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
数值 | 2 | 6 | 7 | 3 | 8 | 9 |
记下来比较下标为2的元素7,和前边0~1下标的元素对比,从后往前找,如果找到比7大的元素,则将该元素后边的序列依次后移,将7插入该元素位置
目前7不需要移动。
接下来寻找下标为3 的元素3,从下标3往前找,由于下标1,下标2的元素都比3大,所以依次后移,将3放倒下标1的位置。
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
数值 | 2 | 3 | 6 | 7 | 8 | 9 |
以此类推,进行比较。
算法实现
1 |
func insertSort(slice []int) { |
该算法时间复杂度为O(n*n)
冒泡排序
算法描述
假设用户输入了如下数组
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
数值 | 6 | 2 | 7 | 3 | 8 | 9 |
冒泡排序依次比较相邻的两个元素 ,将大的元素后移即可。
先比较下标为0和下标为1的元素,6比2大,所以6和2交换位置。
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
数值 | 2 | 6 | 7 | 3 | 8 | 9 |
接下来比较下标为1和下标为2的元素,6比7小所以不做交换。然后比较7和3,7比3大,7和三交换位置,以此类推,直到比较到最后一个元素
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
数值 | 2 | 6 | 3 | 7 | 8 | 9 |
经过这一轮相邻元素的比较,将最大的元素9冒泡到最后的位置。
接下来重复上述步骤,从下标0开始到下标4两两比较,将第二大元素放到下标4的位置,因为下标5已经是最大元素,所以不参与比较。
算法实现
1 |
func bubbleSort(slice []int) { |
选择排序
算法描述
假设用户输入了如下数组
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
数值 | 6 | 2 | 7 | 3 | 8 | 9 |
从下标0开始,比较6和其他位置的元素,找到最小的元素2和6交换位置
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
数值 | 2 | 6 | 7 | 3 | 8 | 9 |
接下来从下标1开始,比较6和后边位置的元素,选择最小的和6交换位置。
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
数值 | 2 | 3 | 7 | 6 | 8 | 9 |
以此类推,从下标2开始,比较7和后边的元素,选择最小的6交换位置
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
数值 | 2 | 3 | 6 | 7 | 8 | 9 |
以此类推,直到下标5的位置元素都比较完。
算法实现
1 |
func selectSort(slice []int) { |
该算法时间复杂度为o(n*n)
main函数中调用并测试
1 |
func main() { |
到此为止,四种基本的比较算法已经完成,感兴趣的可以自己实现以下。
上述所有源码下载地址
源码下载地址
谢谢关注我的公众号
golang实现四种排序(快速,冒泡,插入,选择)的更多相关文章
- Java四种排序:冒泡,选择,插入,二分(折半插入)
四种排序:冒泡,选择,插入,二分(折半插入) public class Test{ // public static void main(String[] args) { // Test t=new ...
- AJPFX关于Java中运用数组的四种排序方法
JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法.快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现.冒泡法是运用遍历数组进行比 ...
- 【C++】四种排序算法的时间比较
四种排序算法的时间比较 [注]clock函数对输入(用户输入)元素N排序的计时 #include<iostream> #include<time.h> using namesp ...
- 左神算法第一节课:复杂度、排序(冒泡、选择、插入、归并)、小和问题和逆序对问题、对数器和递归(Master公式)
第一节课 复杂度 排序(冒泡.选择.插入.归并) 小和问题和逆序对问题 对数器 递归 1. 复杂度 认识时间复杂度常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数 ...
- SQL Server - 四种排序, ROW_NUMBER() /RANK() /DENSE_RANK() /ntile() over()
>>>>英文版 (更简洁易懂)<<<< 转载自:https://dzone.com/articles/difference-between-rownum ...
- 【SQL】四种排序开窗函数
一 .简单了解什么是开窗函数 什么是开窗函数,开窗函数有什么作用,特征是什么? 所谓开窗函数就是定义一个行为列,简单讲,就是在你查询的结果上,直接多出一列值(可以是聚合值或是排序号),特征就是带有ov ...
- Hive 中的四种排序详解,再也不会混淆用法了
Hive 中的四种排序 排序操作是一个比较常见的操作,尤其是在数据分析的时候,我们往往需要对数据进行排序,hive 中和排序相关的有四个关键字,今天我们就看一下,它们都是什么作用. 数据准备 下面我们 ...
- Java 二维数组,排序、切换顺序,查表法二进制十进制,这班查找、排序(冒泡、选择)、遍历,获取最大小值(4)
Java 二维数组,排序.切换顺序,查表法二进制十进制,折半查找.排序(冒泡.选择).遍历,获取最大小值(4)
- php -- 四种基础排序:冒泡、选择、插入、快速
冒泡排序 思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来. 第一轮:从第一个到最后一个冒泡比较,运行结果:最后一个最大 第二轮:从第一个到倒数第二个冒泡比较, 运行结果:最后一 ...
随机推荐
- mysqldump 使用--tab=path参数时提示mysqldump: Got error: 1290: The MySQL server is running with the --secure-file-priv option so it cannot execute this statement when executing 'SELECT INTO OUTFILE'
报错: [root@zedu test]# mysqldump -h127.0.0.1 -uroot -p --single-transaction --add-drop-database --tab ...
- Missing artifact com.sun.jmx:jmxri:jar:1.2.1的解决方法
maven项目添加log4j-1.2.15依赖出现Missing artifact com.sun.jmx:jmxri:jar:1.2.1错误 解决方法一:修改log4j.jar的版本为1.2.16或 ...
- java 枚举类(简单使用)
直接上代码 用法一(常量): package com.ou.test; import com.sun.corba.se.impl.util.SUNVMCID; public class Enum { ...
- vue基本语法 JS补充
目录 一.VUE框架入门 1. vue框架的优势 二.VUE框架的基本使用 1. vue的引用 2. vue的基本语法结构 2. 插值表达式 3. 文本指令 (1)v-text (2)v-html ( ...
- JZOJ 5988 珂学计树题 (Burnside引理)
什么神题a-没学过Burnside引理a学了也做不来系列-考场没怎么看这题,上最后十分钟打了样例就溜了-然后这题爆0了. Here CODE #include <cctype> #incl ...
- vue cli3 + cube-ui 配置rem踩坑记录
在install cube-ui时,选择了后编译,选中使用rem的时候会发现,怎么刷新页面的html字体被设置成了37.5px 感觉太大了,于是去寻找修改的办法,第一反应是webpack的配置,于是去 ...
- 32. ClustrixDB License管理
一.许可的概述 ClustrixDB必须拥有有效的许可证才能运行.本授权指定: 集群中允许的最大节点数 ClustrixDB将使用的最大核数 在裸金属系统上,ClustrixDB将尝试启用与已授权的物 ...
- Linux 打印可变参数日志
实现了传输进去的字符串所在的文档,函数和行数显示功能. 实现了将传入的可变参数打印到日志功能. #include<stdio.h> #include<stdarg.h> #in ...
- 顺序表应用6:有序顺序表查询(SDUT 3330)
Problem Description 顺序表内按照由小到大的次序存放着n个互不相同的整数,任意输入一个整数,判断该整数在顺序表中是否存在.如果在顺序表中存在该整数,输出其在表中的序号:否则输出&qu ...
- echarts的渲染问题
问题:柱状图的图例和柱状图颜色在IE10和IE11中拖动时间轴的时候图例和柱状图颜色会发生改变 echarts的渲染是从setOption中开始的,不是从echarts.init()开始 initPa ...