1. 冒泡排序(bubble sort)的基本思想:比较相邻两个 元素的关键字值,如果反序,则交换

func BubbleSort(arr []int) {
flag := false
//外层控制行
for i := 0; i < len(arr)-1; i++ {
//内层控制列
for j := 0; j < len(arr)-1-i; j++ {
//比较两个相邻元素
if arr[j] > arr[j+1] {
//交换数据
arr[j], arr[j+1] = arr[j+1], arr[j]
flag = true
}
}
//判断数据是否是有序
if !flag {
return
} else {
flag = false
}
}
}

 2. 快速排序

快速排序(quick sort)是一种分区交换排序算法.

它的基本思想:在数据序列中选择一个值作为比较的基准值, 每趟从数据序列的两端开始交替进行,将小于基准值的元素交换到序列前端,将大于基准值的元素交换到序列后端, 介于两者之间的位置则成为基准值的最终位置。

func QuickSort(arr []int, left int, right int) {
//设置基准值
temp := arr[left]
index := left i := left
j := right for i <= j {
//从右面找到比基准值小的数据
for j >= index && arr[j] >= temp {
j--
}
//获取基准值合适下标
if j > index {
arr[index] = arr[j]
index = j
}
//从左面找比基准值大的数据
for i <= index && arr[i] <= temp {
i++
}
//获取基准值合适下标
if i <= index {
arr[index] = arr[i]
index = i
}
}
//将基准值放在合适位置
arr[index] = temp //递归调用 分步处理数据
if index-left > 1 {
QuickSort(arr, left, index-1)
}
if right-index > 1 {
QuickSort(arr, index+1, right)
} }

3. 直接选择排序

直接选择排序(straight select sort)的基本思想:第一趟从n个元素的数据序列中选出关键字最小(或最大)的元素并放到最前(或最后)位置,下一趟再从n-1个元素中选出最小(大)的元素并放到次前(后)位置,以此类推,经过n-1趟完成排序。

func SelectSort(arr []int) {

	//外层控制行
for i := 0; i < len(arr); i++ {
//记录最大值下标
index := 0
//内层控制列
//遍历数据 查找最大值
for j := 1; j < len(arr)-i; j++ {
if arr[j] > arr[index] {
//记录下标
index = j
}
} //交换数据
arr[index], arr[len(arr)-1-i] = arr[len(arr)-1-i], arr[index]
}
}

4.堆排序

堆排序(heap sort)是完全二叉树的应用,它的基本思想:将数据序列“堆”成树状,每趟只遍历树中的一条路径。

//初始化堆
func HeapInit(arr []int) { //将切片转成二叉树模型 实现大根堆
length := len(arr)
for i := length/2 - 1; i >= 0; i-- {
HeapSort(arr, i, length-1)
} //根节点存储最大值
for i := length - 1; i > 0; i-- {
//如果只剩下根节点和跟节点下的左子节点
if i == 1 && arr[0] <= arr[i] {
break
}
//将根节点和叶子节点数据交换
arr[0], arr[i] = arr[i], arr[0]
HeapSort(arr, 0, i-1)
} } //获取堆中最大值 放在根节点
func HeapSort(arr []int, startNode int, maxNode int) { //最大值放在根节点
var max int
//定义做左子节点和右子节点
lChild := startNode*2 + 1
rChild := lChild + 1
//子节点超过比较范围 跳出递归
if lChild >= maxNode {
return
}
//左右比较 找到最大值
if rChild <= maxNode && arr[rChild] > arr[lChild] {
max = rChild
} else {
max = lChild
} //和跟节点比较
if arr[max] <= arr[startNode] {
return
} //交换数据
arr[startNode], arr[max] = arr[max], arr[startNode]
//递归进行下次比较
HeapSort(arr, max, maxNode)
}

5. 插入排序

func InsertSort(arr []int) {
for i := 1; i < len(arr); i++ {
//如果当前数据小于有序数据
if arr[i] < arr[i-1] {
j := i - 1
//获取有效数据
temp := arr[i]
//一次比较有序数据
for j >= 0 && arr[j] > temp {
arr[j+1] = arr[j]
j--
}
arr[j+1] = temp
}
}
}

 6. 希尔排序

希尔排序(shell sort)又称缩小增量排序,它的基本思想:分组的直接插入排序。

func ShellSort(arr []int) {
//根据增量(len(arr)/2)每次变成上一次的1/2
for inc := len(arr) / 2; inc > 0; inc /= 2 { for i := inc; i < len(arr); i++ {
temp := arr[i] //根据增量从数据到0进行比较
for j := i - inc; j >= 0; j -= inc {
//满足条件交换数据
if temp < arr[j] {
arr[j], arr[j+inc] = arr[j+inc], arr[j]
} else {
break
}
}
}
}
}

 7. 二分查找 BinarySearch(数据,元素) 返回值为下标

package main

import "fmt"

func BinarySearch(arr []int, num int) int {
//定义起始下标
start := 0
//定义结束下标
end := len(arr) - 1
//中间基准值
mid := (start + end) / 2 for i := 0; i < len(arr); i++ {
//基准值为查找值
if num == arr[mid] {
return mid
} else if num > arr[mid] {
//比基准值大 查找右侧
start = mid + 1
} else {
//比基准值小 查找左侧
end = mid - 1
}
//再次设置中间基准值位置
mid = (start + end) / 2
}
return -1
}
func main() {
//前提必须是 "有序数据"
arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
num := 666 index := BinarySearch(arr, num)
fmt.Println(index)
}

 8. 变相排序

变相排序  基于大量重复 在某一个范围内

func main02() {
//随机数种子
rand.Seed(time.Now().UnixNano())
s := make([]int, 0) for i := 0; i < 10000; i++ {
s = append(s, rand.Intn(1000)) //0-999
}
fmt.Println(s) //统计数据集合中数据出现的次数
m := make(map[int]int)
for i := 0; i < len(s); i++ {
m[s[i]]++
}
//fmt.Println(m) //排序
for i := 0; i < 1000; i++ {
for j := 0; j < m[i]; j++ {
fmt.Print(i, " ")
}
} }

GO 语言常用排序的更多相关文章

  1. C语言常用排序全解(转)

    目的:重温经典排序思想,并用C语言指针实现排序算法================================================*/ /*====================== ...

  2. 我们一起来排序——使用Java语言优雅地实现常用排序算法

    破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...

  3. C语言常用的库文件(头文件、函数库)

    C语言常用的库文件(头文件.函数库) C系统提供了丰富的系统文件,称为库文件.C的库文件分为两类,一类是扩展名为".h"的文件,称为头文件,在前面的包含命令中我们已多次使用过.在& ...

  4. 常用排序算法的python实现和性能分析

    常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...

  5. 【R】R语言常用函数

    R语言常用函数 基本 一.数据管理vector:向量 numeric:数值型向量 logical:逻辑型向量character:字符型向量 list:列表 data.frame:数据框c:连接为向量或 ...

  6. JS实现常用排序算法—经典的轮子值得再造

    关于排序算法的博客何止千千万了,也不多一个轮子,那我就斗胆粗制滥造个轮子吧!下面的排序算法未作说明默认是从小到大排序. 1.快速排序2.归并排序3.冒泡排序4.选择排序(简单选择排序)5.插入排序(直 ...

  7. Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...

  8. 转载部长一篇大作:常用排序算法之JavaScript实现

    转载部长一篇大作:常用排序算法之JavaScript实现 注:本文是转载实验室同门王部长的大作,找实习找工作在即,本文颇有用处!原文出处:http://www.cnblogs.com/ywang172 ...

  9. 帮初学者改代码——有多少青春可以挥霍之“c语言 多重排序”

    原文:“c语言 多重排序” 原代码: #include<stdio.h> #include<string.h> struct A { char name[100]; int g ...

随机推荐

  1. win10锁屏壁纸文件夹Assets中无文件问题的解决方法

    一.前言 win10在锁屏时会有很多精美的壁纸,在网上查找到win10锁屏壁纸存放目录为 : C:\Users\你的用户名\AppData\Local\Packages\Microsoft.Windo ...

  2. Splay树详解

    更好的阅读体验 Splay树 这是一篇宏伟的巨篇 首先介绍BST,也就是所有平衡树的开始,他的China名字是二叉查找树. BST性质简介 给定一棵二叉树,每一个节点有一个权值,命名为 ** 关键码 ...

  3. net.exe和net1.exe的区别&联系.

    system32文件夹下有一个net.exe和net1.exe,一般做渗透的时候,很多情况下管理员只知道删除net.exe而遗漏net1.exe,导致我们能继续do evil..... 一直没弄明白它 ...

  4. FormCollection使用

    FormCollection用来在controller中获取页面表单元素的数据.它是表单元素的集合,包括<input type="submit" />元素. 用法举例: ...

  5. 如何使用 Vue 来实现一个项目多平台打包?

    这个需求是源于我们要根据一个项目,针对某些组件(比如:日期 和 下拉组件 ) 和 页面 做终端的兼容,最终需要实现打包成2个平台:h5 和 pc  H5平台,日期组件:                ...

  6. 二、vue基础--计算属性和监听器

    1.一些操作需要计算后才能得到的用计算属性,需要放在computed属性中代码如下: <div id='app'> <div> <label>宽:</labe ...

  7. Python----常用的__doc__、__name__、__file__的使用

    各自的作用: __doc__:获取到注释内容 __name__:获取到函数的名称 __file__:获取到当前的文件路径 示例代码: #!/usr/bin/env python # -*- codin ...

  8. Excle导出优化(poi)

    搜索词条 1.idea报java.lang.OutOfMemoryError: Java heap space怎么解决? 2.java.lang.OutOfMemoryError: GC overhe ...

  9. BZOJ 3887/Luogu P3119: [Usaco2015 Jan]Grass Cownoisseur (强连通分量+最长路)

    分层建图,反向边建在两层之间,两层内部分别建正向边,tarjan缩点后,拓扑排序求一次1所在强连通分量和1+n所在强联通分量的最长路(长度定义为路径上的强联通分量内部点数和).然后由于1所在强连通分量 ...

  10. focus([[data],fn]) 当元素获得焦点时,触发 focus 事件。

    focus([[data],fn]) 概述 当元素获得焦点时,触发 focus 事件.直线电机选型 可以通过鼠标点击或者键盘上的TAB导航触发.这将触发所有绑定的focus函数,注意,某些对象不支持f ...