摘要

排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

冒泡排序

 func BubbleSort(vector []int) {
fmt.Println("BubbleSort")
fmt.Println(vector)
for i := ; i < len(vector); i++ {
tag := true // 为了剪枝
// 每一趟将最大的数冒泡
for j := ; j < len(vector)-i-; j++ {
if vector[j] > vector[j+] { /*vector[j] < vector[j+1]*/
temp := vector[j]
vector[j] = vector[j+]
vector[j+] = temp
tag = false
}
}
if tag {
break //0~len(vector)-i没有发生交换说明已经有序
}
fmt.Println(vector)
}
}

插入排序

 func InsertSort(vector []int) {
fmt.Println("InsertSort")
fmt.Println(vector)
for i := ; i < len(vector); i++ {
// 每一趟不满足条件就选择i为哨兵保存,将哨兵插入0~i-1有序序列(0~i-1始终是有序的)
if vector[i] < vector[i-] { /*vector[i] > vector[i-1]*/
temp := vector[i]
//后移直到找到哨兵合适的位置
j := i -
for ; j >= && vector[j] > temp; j-- { /*vector[j] < temp*/
vector[j+] = vector[j]
}
//插入位置前后都是有序的,最后也是有序的
vector[j+] = temp
}
fmt.Println(vector)
}
}

选择排序

 func SelectSort(vector []int) {
fmt.Println("SelectSort")
fmt.Println(vector)
for i := ; i < len(vector); i++ {
// 选择最小的元素
k := i
for j := i + ; j < len(vector); j++ {
if vector[k] > vector[j] {
k = j
}
}
// 交换
if k != i {
temp := vector[i]
vector[i] = vector[k]
vector[k] = temp
}
fmt.Println(vector)
}
}

二元选择排序

 func BinarySelectSort(vector []int) {
fmt.Println("SelectSort")
fmt.Println(vector)
n := len(vector)
for i := ; i < n/; i++ {
// 选择最小的元素和最大元素
k := i
t := n - i -
for j := i + ; j <= n-i-; j++ {
if vector[k] > vector[j] {
k = j
}
if vector[t] < vector[j] {
t = j
}
}
// 交换
if k != i {
temp := vector[i]
vector[i] = vector[k]
vector[k] = temp
}
if t != n-i- {
temp := vector[n-i-]
vector[n-i-] = vector[t]
vector[t] = temp
}
fmt.Println(vector)
}
}

快速排序

简单的说快速排序就是挖坑填数然后分治,公认效率最好,这个必须会

 func QuickSort(vector []int, low, hight int) {
fmt.Println(vector)
if low < hight {
i := low
j := hight
temp := vector[low] // 开始挖坑填数
for i < j {
for i < j && vector[j] >= temp {
j--
}
vector[i] = vector[j]
for i < j && vector[i] <= temp {
i++
}
vector[j] = vector[i]
}
vector[i] = temp
QuickSort(vector, low, i-) // 分治
QuickSort(vector, i+, hight)
}
}

常见问题,已知序列WAUSTHKO,将第一个数作W为基数,问:

1,第一趟后的序列是多少?假设递归同时进行

1),OAUSTHKW

2),KAHOTSUW

3),HAKOSTUW

4),AHKOSTUW

2,排序过程中那些数会被作为选基数?

以上标记的都是:W,O,K、T,H

3,基数的选择直接影响到效率,同时排序末尾显然有效率问题,可以用其他算法替换。

基本排序算法Golang的更多相关文章

  1. 数据结构和算法(Golang实现)(25)排序算法-快速排序

    快速排序 快速排序是一种分治策略的排序算法,是由英国计算机科学家Tony Hoare发明的, 该算法被发布在1961年的Communications of the ACM 国际计算机学会月刊. 注:A ...

  2. 数据结构和算法(Golang实现)(18)排序算法-前言

    排序算法 人类的发展中,我们学会了计数,比如知道小明今天打猎的兔子的数量是多少.另外一方面,我们也需要判断,今天哪个人打猎打得多,我们需要比较. 所以,排序这个很自然的需求就出来了.比如小明打了5只兔 ...

  3. 数据结构和算法(Golang实现)(19)排序算法-冒泡排序

    冒泡排序 冒泡排序是大多数人学的第一种排序算法,在面试中,也是问的最多的一种,有时候还要求手写排序代码,因为比较简单. 冒泡排序属于交换类的排序算法. 一.算法介绍 现在有一堆乱序的数,比如:5 9 ...

  4. 数据结构和算法(Golang实现)(20)排序算法-选择排序

    选择排序 选择排序,一般我们指的是简单选择排序,也可以叫直接选择排序,它不像冒泡排序一样相邻地交换元素,而是通过选择最小的元素,每轮迭代只需交换一次.虽然交换次数比冒泡少很多,但效率和冒泡排序一样的糟 ...

  5. 数据结构和算法(Golang实现)(21)排序算法-插入排序

    插入排序 插入排序,一般我们指的是简单插入排序,也可以叫直接插入排序.就是说,每次把一个数插到已经排好序的数列里面形成新的排好序的数列,以此反复. 插入排序属于插入类排序算法. 除了我以外,有些人打扑 ...

  6. 数据结构和算法(Golang实现)(22)排序算法-希尔排序

    希尔排序 1959 年一个叫Donald L. Shell (March 1, 1924 – November 2, 2015)的美国人在Communications of the ACM 国际计算机 ...

  7. 数据结构和算法(Golang实现)(23)排序算法-归并排序

    归并排序 归并排序是一种分治策略的排序算法.它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列. 归并排序首先由著名的现代计算机之父John_von_ ...

  8. 数据结构和算法(Golang实现)(24)排序算法-优先队列及堆排序

    优先队列及堆排序 堆排序(Heap Sort)由威尔士-加拿大计算机科学家J. W. J. Williams在1964年发明,它利用了二叉堆(A binary heap)的性质实现了排序,并证明了二叉 ...

  9. 常见排序算法的golang 实现

    五种基础排序算法对比 五种基础排序算法对比 1:冒泡排序 算法描述 比较相邻的元素.如果第一个比第二个大,就交换它们两个: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素 ...

随机推荐

  1. Shiro与Spring整合

    Shiro引入Spring 添加jar包/maven配置 <!-- shiro支持 --> <dependency> <groupId>org.apache.shi ...

  2. 16.The Effect of Advertisement 广告的影响

    16.The Effect of Advertisement 广告的影响 (1) The appeal of advertising to buying motives can have both n ...

  3. Web打印控件Lodop实现表格物流单的打印

    Web打印控件Lodop实现表格物流单的打印 一.lodop打印预览效果图 LODOP.PRINT_SETUP();打印维护效果图 LODOP.PREVIEW();打印预览图 二.写在前面 最近项目用 ...

  4. mysql thread pool

    转自:http://blog.csdn.net/wyzxg/article/details/8258033 mysql 线程处理流程图: Mysql支持单线程和多线程两种连接线程模式,如果单线程,则在 ...

  5. Robust Influence Maximization

    一.   研究背景 在社会和经济网络中,影响最大化问题在过去十年中得到广泛的研究,由于其广泛应用于病毒式营销[1,2],突破检测[3],谣言监测[4]等.例如公司可以通过向初始用户(称为种子)发送免费 ...

  6. 洛谷P1725--琪露诺(单调队列)

    https://www.luogu.org/problemnew/show/P1725 关于滑动窗口的解释https://www.cnblogs.com/albert67/p/10449039.htm ...

  7. Python的基本数据类型

    数据类型常用函数 type(a)-得到变量a的数据类型 isinstance(a,str)-判断a是否是字符串类型 Python中有五个标准数据类型 数字Number 字符串String 数组List ...

  8. Android中实现gif动画

    一.需求 Android本身没有提供直接显示gif动画的相关控件,因此需要自定义GifImageView类来实现gif的播放,主要是使用的Movie类来解决的. 二.自定义GifImageView p ...

  9. FPGA定点小数计算中截位形式的探讨

    在FPGA设计过程中难免会碰到需要进行截位,那定点小数的计算过程中我们需要注意些什么呢? 首先,我们考虑如下计算式. sin cos 数据形式是 FIX_32_30 X Y Z 数据形式是 FIX_3 ...

  10. 简单 v.s. 基础

    无论做平面设计还是做摄影创作,其基础都是一些比较粗浅的看似毫无用处的简单技能.例如画直线.拍挂在墙上的电视机,不一而足. 同样的现象还能在web的前端设计中看到.一堆类似小孩学绘画的标签,几个可以更改 ...