首页 > 编程语言 >【入门】Go语言排序算法详解

【入门】Go语言排序算法详解

时间:2023-04-01 17:55:07浏览次数:39  
标签:arr main 入门 ++ fmt 元素 详解 Go 排序

1、冒泡排序
冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻的两个元素,并在必要时交换它们的位置,直到没有任何一对元素需要交换为止。该算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

package main

import "fmt"

// 我们定义了一个名为`bubbleSort`的函数,该函数接收一个整数数组`arr`作为参数。
// 在函数内部,我们首先获取数组的长度`n`,然后使用两个嵌套的循环来遍历数组。在内部循环中,
// 我们比较相邻的两个元素,如果前一个元素比后一个元素大,则交换它们的位置。最后,
// 当内部循环结束时,我们可以确定该数组已经排好序。

func bubbleSort(arr []int) {
	n := len(arr)
	for i := 0; i < n-1; i++ {
		for j := 0; j < n-i-1; j++ {
			if arr[j] > arr[j+1] {
				arr[j], arr[j+1] = arr[j+1], arr[j]
			}
		}
	}
}
func main() {
	arr := []int{64, 25, 12, 22, 11}
	bubbleSort(arr)
	fmt.Println("Sorted array:", arr)
}

代码输出内容:

Sorted array: [11 12 22 25 64]

第二个案例:

package main

import "fmt"

func main() {
	s := []int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
	var temp int
	for i := 0; i < len(s)-1; i++ { // 比较9次
		for j := 0; j < len(s)-1-i; j++ {
			if s[j] > s[j+1] {
				temp = s[j]
				s[j] = s[j+1]
				s[j+1] = temp
			}
		}
	}
	fmt.Println(s)
}

代码输出内容:

[0 1 2 3 4 5 6 7 8 9]

总结:

  • 从切片头部开始,不断比较相邻的两个元素的大小,让较大的元素逐渐往后移动(交换两个元素的值),直到切片的末尾。经过第一轮的比较,就可以找到最大的元素,并移动至最后一个位置。
  • 第一轮结束后,继续第二轮。仍然从切片头部开始比较,让较大的元素逐渐往后移动,直到切片的倒出第二个元素为止。经过第二轮的比较,就可以找到次大的元素,并将它放到倒数第二的位置。
  • 以此类推,进行n-1(n切片的长度)轮,"冒泡"后,就可以将所有的元素都排序好。

2、选择排序
选择排序(Selection Sort)是一种简单直观的排序算法,其基本思想是:首先在未排序的数列中找到最小(大)元素,然后将其存放到数列的起始位置,接着再从剩余未排序的元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

package main

import "fmt"

func main() {
	s := []int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
	for j := 0; j < len(s)-1; j++ {
		min := s[j]
		minIndex := j
		for i := j + 1; i < len(s); i++ {
			if min > s[i] {
				min = s[i]
				minIndex = i
			}
		}
		if minIndex != j {
			s[j], s[minIndex] = s[minIndex], s[j]
		}
	}
	fmt.Println(s)
}

代码输出内容:

[0 1 2 3 4 5 6 7 8 9]

总结:

  • 第一趟排序在所有待排序的n个记录中选出关键字最小的记录,将它与列表中第一个进行交换,使关键字最小的记录在数据表最前端。
  • 第二趟在剩下的n-1记录中在选出关键字最小的记录,将其与数据表中的第二个记录交换位置,使关键字次小的记录处于数据表第二个位置。
  • 重复这样的操作,最终实现数据表的升序排序。

标签:arr,main,入门,++,fmt,元素,详解,Go,排序
From: https://www.cnblogs.com/qinziteng/p/17278541.html

相关文章

  • HJ70_矩阵乘法计算量估算_入门栈使用的典型题
    反思:这题咋一看不难,但是越做坑越多,按照一开始不完善的思路无法完全通过测试。参看高赞答案,代码行数特少。但是没考虑一个括号中有三个矩阵的情况。思路:1、判断哪两个矩阵开始相乘的条件:遇到“)”时,该字符前两个矩阵开始相乘。把相乘后矩阵行列数组压入栈栈中。该题默认不存在(A(......
  • JS基础-jQuery快速入门
    作用简介:jQuery是一个JavaScript库,它极大地简化了JavaScript编程,极大简化了DOM操作及事件处理。它通过CSS选择器定位元素,并将这些元素封装在特定JavaScript对象中,然后,开发者就可以更改元素或者给元素添加事件监听器。jQuery能够处理的任何工作,都可以用既有的JavaScript代码......
  • Java protected 关键字详解
    很多介绍Java语言的书籍(包括《Java编程思想》)都对protected介绍的比较的简单,基本都是一句话,就是: 被protected修饰的成员对于本包和其子类可见。这种说法有点太过含糊,常常会对大家造成误解。实际上,protected的可见性在于两点:基类的protected成员是包内可见的,并且对子类......
  • stat函数详解
    stat函数详解作用:获取文件信息头文件:#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>函数原型:**intstat(constcharpath,structstatbuf)返回值:成功返回0,失败返回-1;参数:文件路径(名),structstat类型的结构体structstat结构体详解:structstat{......
  • 3·1HTTP协议特点、3·2详解URL与URI的区别与联系、3·3HTTP报文结构分析、3·4HTTP请
     HTTP协议特点支持客户/服务器模式客户/服务器模式工作的方式是由客户端向服务器发出请求,服务器端响应请求,并进行相应服务简单快速 客户端向服务器请求服务时,只需传输请求方法和路径 请求方法常用的有GET、HEAD、POST。每种方法规......
  • 企业实践 | 如何在阿里云裸金属服务器上使用UEFI模式实践安装国产银河麒麟V10操作系统
    [点击......
  • 《Mysql基础》【Mysql触发器 新建触发器、修改触发器、删除触发器、举例】 编程入门
     --mysql数据库程序设计笔记:--=========第八章:触发器========================触发器:触发执行特定事件。(关联表对象,当特定事件出现时,触发激活)目的:保护表数据,(保证表数据完整性和一致性。)1、新建触发器:格式:createtrigger数据库名.触发器名称触发时刻inserton表名f......
  • 《Mysql基础》【Mysql表查询、去重、表连接、左连接 右连接、子表查询、排序、分组等
     --mysql数据库程序设计笔记:第三章:查询1、单表查询:1)、简单查询查所有列:格式:select*from表名;举例:mysql>select*fromtb_student;+----+-----------+-------------+------+------------+----------+--------+---------+-------------------+|id|studentNo|s......
  • HTTP协议特点&详解UR与URL的区别与联系
    HTTP协议特点支持客户/服务器模式客户/服务器模式工作的方式是由客户端向服务器发送请求,服务器端响应请求,并进行相应服务   简单快速客户向服务器请求服务时,只需传送请求方法和路径请求方法常用的有GET,HEAD,POST。每种方法规定了客户与服务器练习的......
  • Spring(Bean详解)
    GoF之工厂模式GoF是指二十三种设计模式GoF23种设计模式可分为三大类:创建型(5个):解决对象创建问题。单例模式工厂方法模式抽象工厂模式建造者模式原型模式结构型(7个):一些类或对象组合在一起的经典结构。代理模式装饰模式适配器模式组......