Go语言排序算法实现
// Algorithm project Algorithm.go
package Algorithm // 冒泡排序
func BubbleSort(a []int) {
n := len(a)
for i := n; i > ; i-- {
for j := ; j < i-; j++ {
if a[j] > a[j+] {
a[j], a[j+] = a[j+], a[j]
}
}
}
} // 选择排序
func SelectSort(a []int) {
n := len(a)
for i := ; i < n-; i++ {
k := i
for j := i + ; j < n; j++ {
if a[j] < a[k] {
k = j
}
}
a[i], a[k] = a[k], a[i]
}
} // 插入排序
func InsertionSort(a []int) {
n := len(a)
for i := ; i < n; i++ {
temp := a[i]
j := i -
for ; j >= && a[j] > temp; j-- {
a[j+] = a[j]
}
a[j+] = temp
}
} // 希尔排序
func ShellSort(a []int) {
n := len(a)
for d := n / ; d >= ; d /= {
for i := d; i < n; i++ {
temp := a[i]
j := i - d
for ; j >= && a[j] > temp; j -= d {
a[j+d] = a[j]
}
a[j+d] = temp
}
}
} // 快速排序的一次划分
func partition(a []int, s int, e int) int {
temp := a[s]
i := s
j := e
for i < j {
for i < j && a[j] > temp {
j--
}
if i < j {
a[i] = a[j]
i++
}
for i < j && a[i] < temp {
i++
}
if i < j {
a[j] = a[i]
j--
}
}
a[i] = temp
return i
} // 快速排序
func QuickSort(a []int, s int, e int) {
if s >= e {
return
}
i := partition(a, s, e)
QuickSort(a, s, i-)
QuickSort(a, i+, e)
} // 堆排序
func HeapSort(a []int) {
n := len(a)
// 建堆
for i := n/ - ; i >= ; i-- {
k := i
for *k+ < n {
j := *k +
if j+ < n && a[j] < a[j+] {
j++
}
if a[j] > a[k] {
a[k], a[j] = a[j], a[k]
k = j
} else {
break
}
}
}
// 调整堆
for i := n - ; i > ; i-- {
a[], a[i] = a[i], a[]
k :=
for *k+ < i {
j := *k +
if j+ < i && a[j] < a[j+] {
j++
}
if a[j] > a[k] {
a[k], a[j] = a[j], a[k]
k = j
} else {
break
}
}
}
} // 合并一次
func mergeOne(a []int, b []int, n int, len int) {
i :=
for i+len < n {
j := i + *len -
if j >= n {
j = n -
}
m := i
k := i
l := i + len
for i < k+len && l <= j {
if a[i] <= a[l] {
b[m] = a[i]
m++
i++
} else {
b[m] = a[l]
m++
l++
}
}
for i < k+len {
b[m] = a[i]
m++
i++
}
for l <= j {
b[m] = a[l]
m++
l++
}
i = j +
}
if i < n {
for ; i < n; i++ {
b[i] = a[i]
}
}
} // 归并排序
func MergeSort(a []int) {
n := len(a)
b := make([]int, n)
len :=
flag :=
for len < n {
if flag == {
mergeOne(a, b, n, len)
}
if flag == {
mergeOne(b, a, n, len)
}
flag = - flag
len *=
}
if flag == {
for i := ; i < n; i++ {
a[i] = b[i]
}
}
}
github链接地址:https://github.com/gaopeng527/go_Algorithm/blob/master/sort.go
Go语言排序算法实现的更多相关文章
- C语言排序算法之简单交换法排序,直接选择排序,冒泡排序
C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 /*简单交换法排序 根据序列中两个记录键值的比较结果来对换这两 ...
- C语言排序算法复习
排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔 ...
- C语言排序算法学习笔记——插入类排序
排序就是讲原本无序的序列重新排序成有序的序列.序列里可以是一个单独数据,也可以是多个数据组合的记录,按照记录里的主关键字或者次关键字进行排序. 排序的稳定性:如果排序表中有两个元素R1,R2,其对应的 ...
- C语言 排序算法
冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就把他们交换过来. 过程演示: 选 ...
- c语言排序算法总结
一.希尔(Shell)排序法 /* Shell 排序法 */ #include <stdio.h> void sort(int v[],int n) { int gap,i,j, ...
- C语言排序算法学习笔记——交换类排序
交换类排序:根据序列中两个元素关键字的比较结果来交换他俩在序列中的位置. 冒泡排序:假设待排序表长为n,从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i])则交换他们 ...
- 两种常用的C语言排序算法
1. 要求输入10个整数,从大到小排序输出 输入:2 0 3 -4 8 9 5 1 7 6 输出:9 8 7 6 5 3 2 1 0 -4 解决方法:选择排序法 实现代码如下: #include &l ...
- C语言排序算法
(1)“冒泡法” 冒泡法大家都较熟悉.其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]>a[i],则交换它们,一直比较到a[n].同理对a[1],a[2],...a[n-1]处理,即 ...
- C语言排序算法学习笔记——选择类排序
选择排序:每一趟(例如第i趟)在后面n-i+1(i=1,2,3,……,n-1)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到n-1趟做完,待排序元素只剩下1个,就不用再选了. 简 ...
- C语言 排序算法总结
#include<stdio.h> #include<stdlib.h> //作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ # ...
随机推荐
- c#代码文件上传和下载
public JsonResult UploadFile(DriverFileManager filem) { var hfc = Syste ...
- Servlet解决中文乱码问题
request.setCharacterEncoding("UTF-8"); 并且把这句话放在request.getParameter()之前
- Java中随机数生成的问题
[生成随机数序列] 我们只能利用Math.random()方法只能生成一个在[0,1)之间的double类型浮点数. 但如果我们想要生成[min, max]之间的随机整数时该怎么办呢? 此时可以用: ...
- 01. Numpy模块
1.科学计算工具-Numpy基础数据结构 1.1.数组ndarray的属性 NumPy数组是一个多维数组对象,称为ndarray.其由两部分组成:① 实际的数据② 描述这些数据的元数据 注意数组格式, ...
- day38 mycql 初识概念,库(增删改查),表(增删改)以及表字段(增删改查),插入更新操作
在Navicat中把已经生成的表逆向成模型 数据库上,右键-逆向数据库到模型 ego笔记: 增删改查 文件夹(库) 增 create database day43 charset utf8; 改 al ...
- 3、Qt Project之Socket网络编程
Socket网络编程 Step1:首先完成整个界面的设计 <?xml version="1.0" encoding="UTF-8"?> <u ...
- 离线下载安装 NLTK 的 nltk_data 模块
离线下载安装 NLTK 的 nltk_data 模块 转 https://blog.csdn.net/u010167269/article/details/63684137 在 Linux 上使用 N ...
- POJ 2481 Cows 【树状数组】
<题目链接> 题目大意: 就是给出N个区间,问这个区间是多少个区间的真子集. 解题分析: 本题与stars类似,只要巧妙的将线段的起点和终点分别看成 二维坐标系中的x,y坐标,就会发现,其 ...
- LeetCode(122. 买卖股票的最佳时机 II)
问题描述 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你 ...
- yum与rpm的区别以及详细介绍
rpm是由红帽公司开发的软件包管理方式,使用rpm我们可以方便的进行软件的安装.查询.卸载.升级等工作.但是rpm软件包之间的依赖性问题往往会很繁琐,尤其是软件由多个rpm包组成时. Yum(全称为 ...