Go:排序算法
一、冒泡排序
package main
import "fmt"
func BubbleSort(arr []int) {
/*
思路:将大的元素一步一步"冒泡"到最后
*/
l := len(arr)
for i := 0; i < l-1; i++ {
exchange := false
for j := 0; j < l-1-i; j++ { // l-1 是因为只需要遍历到数组的倒数第二个元素,此时就可以拿这个元素和最后一个元素比较了
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
exchange = true
}
}
if !exchange {
return
}
}
}
func main() {
arr := []int{5, 17, 1, 68, 22}
fmt.Println("排序前:", arr)
BubbleSort(arr)
fmt.Println("排序后:", arr)
}
二、选择排序
package main
import "fmt"
func SelectSort(arr []int) {
/*
思路:
1.把第一个没有排序过的元素设置为最小值
2.遍历每个没有排序过的元素
如果元素 < 现在的最小值
将此元素设置成为新的最小值
3.经过步骤2后,如果最小值发生改变,则将最小值和第一个没有排序过的位置交换
*/
l := len(arr)
for i := 0; i < l-1; i++ { // l-1 是因为最后一个元素不需要比较了
/*
无序区间:
第一次:[0, l-1]
第二次:[1, l-1]
...
*/
minIndex := i // 记录最小值的索引
for j := i+1; j < l; j++ { // i+1 表示自己不用跟自己比
if arr[j] < arr[minIndex] {
minIndex = j // 更新最小值索引
}
}
if i != minIndex { // i 不是最小值时,将 i 和最小值进行交换
arr[i], arr[minIndex] = arr[minIndex], arr[i]
}
}
}
func main(){
arr := []int{5, 17, 1, 68, 22}
fmt.Println("排序前:", arr)
SelectSort(arr)
fmt.Println("排序后:", arr)
}
三、插入排序
package main
import "fmt"
func InsertSort(arr []int) {
/*
思路:
1.将第一个元素标记为已排序
2.遍历每个没有排序过的元素,将每次遍历的第一个元素用临时变量保存
因为:
第一次遍历从索引 1 开始
第二次遍历从索引 2 开始
所以:
设遍历索引为 i (从1开始),则临时变量保存的元素是 arr[i]
3.如果排序过的最后一个元素 > 临时保存的元素,则将排序过的元素向右移一格;否则,插入这个临时保存的元素
*/
l := len(arr)
for i := 1; i < l; i ++ { // i = [1, 2, 3... l-1]
temp := arr[i] // temp用来保存未排序序列的第一个元素
prevIndex := i - 1 // 已排序序列的最后一个元素索引
for ; prevIndex >=0 && arr[prevIndex] > temp; {
arr[prevIndex + 1] = arr[prevIndex] // 右移
prevIndex -= 1 // 右移过后,temp还要和有序序列的每个元素从后向前依次比较,所以 prevIndex 自减 1
}
arr[prevIndex + 1] = temp // 经过上面的循环右移,直到条件不满足,则将 temp 插入索引为 prevIndex 元素的后面
}
}
func main() {
arr := []int{5, 17, 1, 68, 22}
fmt.Println("排序前:", arr)
InsertSort(arr)
fmt.Println("排序后:", arr)
}
四、快速排序
package main
import "fmt"
func QuickSort(arr []int) {
quickSort(arr, 0, len(arr)-1)
}
func quickSort(arr []int, left, right int) []int {
if left < right {
partitionIndex := partition(arr, left, right)
quickSort(arr, left, partitionIndex-1)
quickSort(arr, partitionIndex+1, right)
}
return arr
}
func partition(arr []int, left, right int) int {
temp := arr[left] // 基准(pivot)元素
for ; left < right; {
// 从序列右边往左边找,直到找到比基准小的元素才退出循环
for ; left < right && arr[right] >= temp; {
right -= 1
}
arr[left] = arr[right] // 将这个元素"左移"
// 从序列左边往右边找,直到找到比基准大的元素才退出循环
for ; left < right && arr[left] <= temp; {
left += 1
}
arr[right] = arr[left] // 将这个元素"右移"
}
arr[left] = temp // 相当于将基准元素放到"中间",此时基准元素左边都是小于基准元素的元素,右边同理
return left
}
func main() {
arr := []int{5, 17, 1, 68, 22}
fmt.Println("排序前:", arr)
QuickSort(arr)
fmt.Println("排序后:", arr)
}
Go:排序算法的更多相关文章
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 几大排序算法的Java实现
很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...
- 排序算法----基数排序(RadixSort(L,max))单链表版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 排序算法汇总(C/C++实现)
前言: 本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...
- 用Java来写常见的排序算法
随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...
- 模板化的七种排序算法,适用于T* vector<T>以及list<T>
最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...
- 排序算法总结第二弹----冒泡排序---javascript描述
上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...
- 排序算法总结------选择排序 ---javascript描述
每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...
随机推荐
- .NetCore 登录(密码盐+随机数)
一.理论部分 1.为什么要给密码加盐 我们在数据库中存入的密码一般不会是明文,都要通加MD5加密后存入,但是有些简单的密码加密后存入数据库也不安全,所有我们采用密码+盐再进行MD5加密存入数据库中. ...
- 我自己总结的sqlite的命令行命令集
我自己总结的sqlite 的命令行命令 导入文本数据文件时,设置分隔符为","sql>.separator "," sql>import devic ...
- JVM系列之:String.intern和stringTable
目录 简介 intern简介 intern和字符串字面量常量 分析intern返回的String对象 分析实际的问题 G1中的去重功能 总结 简介 StringTable是什么?它和String.in ...
- 一个简单的Android小实例分享,包含recycleView与recyclerView嵌套
先上图: 1.首页 2.第二页 3.第三页 项目目录: 代码不多,本人太懒,就不贴了 项目地址:
- SpringCloud系列使用Eureka进行服务治理
1. 什么是微服务? "微服务"一词来自国外的一篇博文,网站:https://martinfowler.com/articles/microservices.html 如果您不能看 ...
- 来自马铁大神的Spark10年回忆录
本篇分享来自Martei在Spark AI Submit 2020的开场分享. 马铁是谁 什么!你不知道马铁是谁?Martei Zaharia(说实话,不知道谁给起的中文名字叫马铁,跟着叫就是了),现 ...
- Python删除元组
Python删除元组: 删除元组中的某一个元素: # 删除元组中的元素 tuple_1 = ('a','b','c','d','e') # 删除第 2 个元素 tuple_1 = tuple_1[:1 ...
- luogu P1721 [NOI2016]国王饮水记 斜率优化dp 贪心 决策单调性
LINK:国王饮水记 看起来很不可做的样子. 但实际上还是需要先考虑贪心. 当k==1的时候 只有一次操作机会.显然可以把那些比第一个位置小的都给扔掉. 然后可以得知剩下序列中的最大值一定会被选择. ...
- 郭超:阿里云Cassandra背后的故事
大家好,我是阿里云数据库产品事业部的玄陵,真名郭超. 本次的分享大概分三个部分:Cassandra云数据库简介.Cassandra云数据库特性以及Q&A. 我们先了解一下Cassand ...
- 【FZYZOJ】愚人节礼物 题解(状压DP)
前言:麻麻我会写状压DP了! ---------------------------- 题目描述 愚人节到了!可爱的UOI小朋友要给孩子们送礼物(汗-原题不是可爱的打败图么= =..).在平面直角坐标 ...