主函数
package main

import (
"fmt"
"math/rand"
"sort"
"time"
)

const (
num = 10000 // 测试数组的长度
rangeNum = 100000 // 数组元素大小范围
)
func main() {
arr := GenerateRand()//生成随机数组
//排序前 复制原数组
org_arr := make([]int, num)
copy(org_arr, arr)
//冒泡排序
//Bubble(arr)
// 选择排序
//SelectSort(arr)
// 插入排序
//InsertSort(arr)
//快速排序
//QuickSort(arr, 0, len(arr)-1)
// 归并排序
//MergeSort(arr, 0, len(arr)-1)
// 堆排序
//HeapSort(arr)
sort.Ints(org_arr) //使sort模块对原数组排序
//fmt.Println(arr, org_arr, IsSame(arr, org_arr))
//打印前15个数,并对比排序是否正确
fmt.Println(arr[:15], org_arr[:15], IsSame(arr, org_arr))
}

//生成随机数组
func GenerateRand() []int {
randSeed := rand.New(rand.NewSource(time.Now().Unix() + time.Now().UnixNano()))
arr := make([]int, num)
for i := 0; i < num; i++ {
arr[i] = randSeed.Intn(rangeNum)
}
return arr
}

//比较两个切片
func IsSame(slice1, slice2 []int) bool {
if len(slice1) != len(slice2) {
return false
}

if (slice1 == nil) != (slice2 == nil) {
return false
}

for i, num := range slice1 {
if num != slice2[i] {
return false
}
}
return true
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
冒泡排序
func Bubble(arr []int) {
size := len(arr)
var swapped bool
for i := size - 1; i > 0; i-- {
swapped = false
for j := 0; j < i; j++ {
if arr[j+1] < arr[j] {
arr[j], arr[j+1] = arr[j+1], arr[j]
swapped = true
}
}
if swapped != true {
break
}
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
选择排序
func SelectSort(arr []int) {
for i := 0; i < len(arr)-1; i++ {
for j := i + 1; j <= len(arr)-1; j++ {
if arr[j] < arr[i] {
arr[j], arr[i] = arr[i], arr[j]
}
}
}
}
1
2
3
4
5
6
7
8
9
插入排序
func InsertSort(arr []int) {
for i := 1; i <= len(arr)-1; i++ {
for j := i; j > 0; j-- {
if arr[j-1] > arr[j] {
arr[j-1], arr[j] = arr[j], arr[j-1]
}
}
}
}
1
2
3
4
5
6
7
8
9
快速排序
func QuickSort(arr []int, l, r int) {
if l < r {
pivot := arr[http://www.my516.com]
i := l - 1
for j := l; j < r; j++ {
if arr[j] <= pivot {
i++
arr[j], arr[i] = arr[i], arr[j]
}
}
i++
arr[r], arr[i] = arr[i], arr[r]
QuickSort(arr, l, i-1)
QuickSort(arr, i+1, r)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
归并排序
//合并
func Merge(arr []int, l, mid, r int) {
// 分别复制左右子数组
n1, n2 := mid-l+1, r-mid
left, right := make([]int, n1), make([]int, n2)
copy(left, arr[l:mid+1])
copy(right, arr[mid+1:r+1])
i, j := 0, 0
k := l
for ; i < n1 && j < n2; k++ {
if left[i] <= right[j] {
arr[k] = left[i]
i++
} else {
arr[k] = right[j]
j++
}
}
for ; i < n1; i++ {
arr[k] = left[i]
k++
}
for ; j < n2; j++ {
arr[k] = right[j]
k++
}
}

//分治
func MergeSort(arr []int, l, r int) {
if l < r {
mid := (l + r - 1) / 2
MergeSort(arr, l, mid)
MergeSort(arr, mid+1, r)
Merge(arr, l, mid, r)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
堆排序
以大顶堆实现

//堆调整
func adjust_heap(arr []int, i, size int) {
if i <= (size-2)/2 {
//左右子节点
l, r := 2*i+1, 2*i+2
m := i
if l < size && arr[l] > arr[m] {
m = l
}
if r < size && arr[r] > arr[m] {
m = r
}
if m != i {
arr[m], arr[i] = arr[i], arr[m]
adjust_heap(arr, m, size)
}
}
}

//建堆
func build_heap(arr []int) {
size := len(arr)
//从最后一个子节点开始向前调整
for i := (size - 2) / 2; i >= 0; i-- {
adjust_heap(arr, i, size)
}
}

func HeapSort(arr []int) {
size := len(arr)
build_heap(arr)
for i := size - 1; i > 0; i-- {
//顶部arr[0]为当前最大值,调整到数组末尾
arr[0], arr[i] = arr[i], arr[0]
adjust_heap(arr, 0, i)
}
}

---------------------

Golang实现常用排序算法的更多相关文章

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

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

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

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

  3. Java 常用排序算法/程序员必须掌握的 8大排序算法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...

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

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

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

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

  6. 常用排序算法java实现

    写在前面:纸上得来终觉浅.基本排序算法的思想,可能很多人都说的头头是到,但能说和能写出来,真的还是有很大区别的. 今天整理了一下各种常用排序算法,当然还不全,后面会继续补充.代码中可能有累赘或错误的地 ...

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

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

  8. Python实现常用排序算法

    Python实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...

  9. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

随机推荐

  1. [转]WCF的几种寄宿方式

    转自:WCF开发框架形成之旅---WCF的几种寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为 ...

  2. HDU 4363

    这题是记忆化搜索很容易想到,但状态却不好设 dp[i][j][u][d][l][r][k].对于矩形为i*j,它的四周的颜色分别为u,d,l,r,横竖切的状态为k的种数. 其中要注意一个问题是,停止不 ...

  3. 设计模式-&gt;观察者模式

    观察者模式能很大的降低模块之前的耦合.详细的观察者模式,客官们能够去看<设计模式>或者<Head first设计模式>等之类的书. 在java中,java.util库中封装了观 ...

  4. SQL Server 2012内部原理及故障排除(专栏)

    PROFESSIONAL SQL SERVER® 2012 INTERNALS AND TROUBLESHOOTING一书(可从这里下载).认为内容非常不错.自己也想对SQL Server 2012有 ...

  5. hdu 1874 畅通project续

    最短路问题,尽管a!=b,可是同一条路測评数据会给你非常多个.因此在读入的时候要去最短的那条路存起来.........见了鬼了.坑爹 #include<iostream> #include ...

  6. hdu 1010 Tempter of the Bone (奇偶性剪枝)

    题意:有一副二维地图'S'为起点,'D'为终点,'.'是可以行走的,'X'是不能行走的.问能否只走T步从S走到D? 题解:最容易想到的就是DFS暴力搜索,,但是会超时...=_=... 所以,,要有其 ...

  7. Android实现浮层的上下滑动(支持内部加入View)

    前言 我K.今天竟然是情人节.对于资深的单身狗来说,简直是个噩耗,今天注定是各种秀恩爱.心塞中.. .. 话题到此结束,管他什么情人节,今天给大家带来的是一个浮层的上下滑动,浮层滑动时分三种状态:所有 ...

  8. pat1013:数素数

    https://www.patest.cn/contests/pat-b-practise/1013 #include "stdio.h" #include "math. ...

  9. DirectFB简介以及移植[一]

    本文转载自‘:http://blog.csdn.net/wavemcu/article/details/39251805 版权声明:本文为博主原创文章,未经博主允许不得转载. ************ ...

  10. (Go)07.Go语言中strings和strconv包示例代码详解01

    1.strings使用 前缀和后缀 HasPrefix判断字符串s是否以prefix开头: 示例: package main import ( "fmt" "string ...