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描述
每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...
随机推荐
- pv绑定pvc
创建pvapiVersion: v1kind: PersistentVolumemetadata: name: pv003 labels: app: vnc003 namespace: vnc-spa ...
- HTTP Keep-Alive的作用
作用: Keep-Alive:使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接.Web服务器,基本上都支持HTTP Keep-Alive ...
- socket通信的三种实现方式
三种 socket 的实现方式 nodejs 下的 socket 服务端代码 const net = require('net') const server = net.createServer() ...
- 集合的一些实例的demo实现
按照斗地主的规则,完成洗牌发牌的动作. 具体规则: 使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. 准备牌: 牌可以设计为一个ArrayList,每个字符串为一 ...
- 爬取图虫网 示例网址 https://wangxu.tuchong.com/23892889/
#coding=gbk import requests from fake_useragent import UserAgent from lxml import etree import urlli ...
- 5.15 牛客挑战赛40 C 小V和字符串 数位dp 计数问题
LINK:小V和字符串 容易想到只有1个数相同的 才能有贡献. 知道两个01串 那么容易得到最小步数 大体上就是 第一个串的最前的1和第二个串最前的1进行匹配. 容易想到设f[i][j]表示 前i位1 ...
- luogu P4884 多少个1?
LINK:多少个1? 题目要求:\(\sum_{i=0}^{n-1}10^i \equiv k \mod m\) 最小的n. 看起来很难求的样子 这个同余式 看起来只能暴力枚举. 不过既然是同余 我们 ...
- IDEA、maven创建webapp项目
maven官方入门指南:http://maven.apache.org/guides/getting-started/index.html 推荐跟着官方文档学习噢~ IDEA.maven创建w ...
- centos7与centos6命令差异
技术群: 816227112 查看ip centos6 : ifconfigcentos7 : ip addr 修改hostname centos6 : 修改/etc/sysconfig/networ ...
- 死磕HashMap
前言 HashMap是Java中最常用的集合类框架,也是Java语言中非常典型的数据结构,同时也是我们需要掌握的数据结构,更重要的是进大厂面试必问之一. 数组特点 存储区间是连续,且占用内存严重,空间 ...