include

  1. 冒泡排序
  2. 插入排序
  3. 快速排序
  4. 选择排序

这4种算法的内涵不再做解释了

github地址

冒泡排序算法

func maoPao(intSlice []int) []int {
/* 冒泡算法不做解释,太简单了 */
for i := 0; i < len(intSlice); i++ {
for j := i + 1; j < len(intSlice); j++ {
if intSlice[i] < intSlice[j] {
tmp := intSlice[i]
intSlice[i] = intSlice[j]
intSlice[j] = tmp
}
}
}
return intSlice
}

插入排序

func chaRu(intSlice []int) []int {
/*
插入排序思想基本是这样的:
我们选取列表第2个数开始,把第一个数和第二个数对比,
1 如果第一个数比第二个数大,那么调换下。
2 如果第二个数比第一个数小,那么就不需要调换。
3 依次类推,同理可得。。。
*/
for i := 1; i < len(intSlice); i++ {
// 下面这个循环是说#当前位置大于0说明开始循环到第二个数了,
// 而且当前列表元素的前一位(该元素左边第一位)大于当前的元素
for i > 0 && intSlice[i-1] > intSlice[i] {
currentNum := intSlice[i]
intSlice[i] = intSlice[i-1]
intSlice[i-1] = currentNum
i = i - 1
} }
return intSlice
}

快速排序

func kuaiShu(intSlice []int, start, end int) []int {
/*
快速排序:
通过一趟排序将要排序的数据分割成独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分数据分别进行快速排序,
整个排序过程可以递归进行,以此达到整个数据变成有序序列。
*/ if start >= end { // 意味着排序结束了
return intSlice
} k := intSlice[start] // 设K为中间数
leftFlag := start // 左侧数的下标,待会移动的时候就是通过下标移动
rightFlag := end // 右侧数的下标 for leftFlag < rightFlag {
for leftFlag < rightFlag && k < intSlice[rightFlag] {
// 开始交换,把比k小的数(array[right_flag] 放到左边)
rightFlag--
} intSlice[leftFlag] = intSlice[rightFlag]
intSlice[rightFlag] = k // 左边的下标开始向右移动
for leftFlag < rightFlag && k >= intSlice[leftFlag] {
// 原理同上,left_flag +=1只是不断找比k大的数
leftFlag++
} // 开始交换,把比k大的数(array[right_flag] 放到右边)
intSlice[rightFlag] = intSlice[leftFlag]
intSlice[leftFlag] = k } kuaiShu(intSlice, start, leftFlag-1) // 对左边的数据排序,递归算法
kuaiShu(intSlice, leftFlag+1, end) // 对右边的数据排序,递归算法
return intSlice
}

选择排序

func xuanZhe(intSlice []int) []int {
/*
选择排序,排序思想如下:
假设一个数组aa[4,3,6,1,23]
1. 对比数组中第一个元素4和第二个元素3,显然3比4小,那么我们用一个变量k来记住3的位置(也就是下标)
2. 接着第二次比较,第二次比较拿3与6比较,显然3比6小,那么k的值不变,继续下一轮,
3. 上面的k值如果没有找到比第二个元素3的话,那么k值就不变,如果找到了比3小的话,那么k的值要变。
4. 循环完成后,那么k值就是就是这个数组最小那个数的下标了。然后就进行判断,如果这个数的下标不是
第一个元素的下标,那么就让第一个元素与下标为k的元素交换下,这么整个数组最小的数就到了数组第一位,
同理可得找出第二个小的数,然后与第二个元素交换位置......
*/
lenSlice := len(intSlice)
var k int
for i := 0; i < lenSlice; i++ {
for j := i + 1; j < lenSlice; j++ {
if intSlice[j] > intSlice[j-1] {
tmp := intSlice[j]
intSlice[j] = intSlice[j-1]
intSlice[j-1] = tmp
k = j // 用一个变量k来记住当前两数最小值位置(也就是下标)
} else {
k = j // 如果当前的数小于等于前一位数,那么说明这个数是两个数的最小值,下标为j
}
}
if intSlice[k] != intSlice[i] { // 把当前标记的最小值与第i个元素调换
tmp := intSlice[i]
intSlice[i] = intSlice[k]
intSlice[k] = tmp
}
}
return intSlice }

怎么调用这些函数

那么我们就写一个main函数来调用吧

func main() {
ss := [5]int{3, 1, 56, 10, 25}
fmt.Println("冒泡算法", maoPao(ss[:]))
fmt.Println("插入算法", chaRu(ss[:]))
fmt.Println("快速排序", kuaiShu(ss[:], 0, len(ss)-1))
fmt.Println("选择排序", xuanZhe(ss[:]))
}

如果对算法有异议,可以联系我 18500776523@sina.cn。

12 go实现几中基本排序算法的更多相关文章

  1. Java中的排序算法(2)

    Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...

  2. STL笔记(6)标准库:标准库中的排序算法

    STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew A ...

  3. javascript 中合并排序算法 详解

    javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的...  合并排序代码如下: <script type="text/javascript& ...

  4. STL中的排序算法

    本文转自:STL中的排序算法 1. 所有STL sort算法函数的名字列表: 函数名    功能描述 sort   对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 ...

  5. JS中常见排序算法详解

    本文将详细介绍在JavaScript中算法的用法,配合动图生动形象的让你以最快的方法学习算法的原理以及在需求场景中的用途. 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements Java ...

  6. STL中sort排序算法第三个参数_Compare的实现本质

    关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数. 重载运算符 全局的比较函数 函数对象 我认为从实现方式看,重 ...

  7. 面试中常用排序算法实现(Java)

    当我们进行数据处理的时候,往往需要对数据进行查找操作,一个有序的数据集往往能够在高效的查找算法下快速得到结果.所以排序的效率就会显的十分重要,本篇我们将着重的介绍几个常见的排序算法,涉及如下内容: 排 ...

  8. 面试中常用排序算法的python实现和性能分析

    这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数学,但是自己还是比较讨厌繁琐的公式,所以基本上文章所有的逻辑,我都尽可能的用大白话 ...

  9. C语言中的排序算法--冒泡排序,选择排序,希尔排序

    冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没 ...

随机推荐

  1. Sphinx/Coreseek 4.1 执行 buildconf.sh 报错,无法生成configure文件

    参考的网址: http://blog.csdn.net/jcjc918/article/details/39032689 错误现象: 执行 buildconf.sh 报错,无法生成configure文 ...

  2. 手动安装 MyEclipse6.5 FindBugs

    手动安装步骤: 官方网址:http://findbugs.sourceforge.net/; 下载地址:http://sourceforge.net/projects/findbugs/files/f ...

  3. [cpu]TI cortex-A9 查看cpu的频率

    Hi Aaron, For checking and changing Cortex-A9 CPU frequency in u-boot, refer to the below files: u-b ...

  4. 模式匹配的KMP算法详解

    这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KMP算法.大概学过信息学的都知道,是个比较难理解的算法,今天特把它搞个彻彻底底明明白白. 注意到这 ...

  5. 【转】WKT、SRID、EPSG概念

    http://www.cnblogs.com/jackdong/archive/2010/12/20/1911558.html 之前一直对WKT.EPSG.SRID不是很理解,总是混淆,今天看了一下, ...

  6. DBExportDoc V1.0 For MySQL

    win7系统下或者64位系统下,安装完mysql-connector-odbc驱动后,直接进入:管理工具--数据源(ODBC),点击添加不显示该驱动,该问题解决如下:进入dos命令行,输入:C:\Us ...

  7. click只能点击一次

    <select id="s_province" name="s_province" class="s_province">< ...

  8. webpack4--热更新

    所谓热更新,就是在浏览器能同步刷新你的代码.webpack 热更新依赖 webpack-dev-server.具体实现步骤如下: 1.局部安装依赖 webpack-dev-server npm ins ...

  9. webpack3--配置多入口和多出口

    上一篇我们稍微提到了webpack.config.js.今天主要来说下如何配置多入口,多出口. 我们之前写到的webpack.config.js,具体代码如下: module.exports = { ...

  10. Windows 7 incorrectly reports "No Internet Access"

    PROBLEM DESCRIPTION Windows 7 may sometimes report that it has "No Internet Access"; this ...