一、冒泡排序

package main

import "fmt"

func BubbleSort(arr []int) {
/*
思路:将大的元素一步一步"冒泡"到最后
*/
l := len(arr)
for i := 0; i < l-1; i++ {
exchange := false
for j := 0; j < l-1-i; j++ { // l-1 是因为只需要遍历到数组的倒数第二个元素,此时就可以拿这个元素和最后一个元素比较了
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
exchange = true
}
}
if !exchange {
return
}
}
} func main() {
arr := []int{5, 17, 1, 68, 22}
fmt.Println("排序前:", arr)
BubbleSort(arr)
fmt.Println("排序后:", arr)
}

二、选择排序

package main

import "fmt"

func SelectSort(arr []int) {
/*
思路:
1.把第一个没有排序过的元素设置为最小值
2.遍历每个没有排序过的元素
如果元素 < 现在的最小值
将此元素设置成为新的最小值
3.经过步骤2后,如果最小值发生改变,则将最小值和第一个没有排序过的位置交换
*/
l := len(arr)
for i := 0; i < l-1; i++ { // l-1 是因为最后一个元素不需要比较了
/*
无序区间:
第一次:[0, l-1]
第二次:[1, l-1]
...
*/
minIndex := i // 记录最小值的索引
for j := i+1; j < l; j++ { // i+1 表示自己不用跟自己比
if arr[j] < arr[minIndex] {
minIndex = j // 更新最小值索引
}
}
if i != minIndex { // i 不是最小值时,将 i 和最小值进行交换
arr[i], arr[minIndex] = arr[minIndex], arr[i]
}
}
} func main(){
arr := []int{5, 17, 1, 68, 22}
fmt.Println("排序前:", arr)
SelectSort(arr)
fmt.Println("排序后:", arr)
}

三、插入排序

package main

import "fmt"

func InsertSort(arr []int) {
/*
思路:
1.将第一个元素标记为已排序
2.遍历每个没有排序过的元素,将每次遍历的第一个元素用临时变量保存
因为:
第一次遍历从索引 1 开始
第二次遍历从索引 2 开始
所以:
设遍历索引为 i (从1开始),则临时变量保存的元素是 arr[i]
3.如果排序过的最后一个元素 > 临时保存的元素,则将排序过的元素向右移一格;否则,插入这个临时保存的元素
*/
l := len(arr)
for i := 1; i < l; i ++ { // i = [1, 2, 3... l-1]
temp := arr[i] // temp用来保存未排序序列的第一个元素
prevIndex := i - 1 // 已排序序列的最后一个元素索引
for ; prevIndex >=0 && arr[prevIndex] > temp; {
arr[prevIndex + 1] = arr[prevIndex] // 右移
prevIndex -= 1 // 右移过后,temp还要和有序序列的每个元素从后向前依次比较,所以 prevIndex 自减 1
}
arr[prevIndex + 1] = temp // 经过上面的循环右移,直到条件不满足,则将 temp 插入索引为 prevIndex 元素的后面
}
} func main() {
arr := []int{5, 17, 1, 68, 22}
fmt.Println("排序前:", arr)
InsertSort(arr)
fmt.Println("排序后:", arr)
}

四、快速排序

package main

import "fmt"

func QuickSort(arr []int) {
quickSort(arr, 0, len(arr)-1)
} func quickSort(arr []int, left, right int) []int {
if left < right {
partitionIndex := partition(arr, left, right)
quickSort(arr, left, partitionIndex-1)
quickSort(arr, partitionIndex+1, right)
}
return arr
} func partition(arr []int, left, right int) int {
temp := arr[left] // 基准(pivot)元素
for ; left < right; {
// 从序列右边往左边找,直到找到比基准小的元素才退出循环
for ; left < right && arr[right] >= temp; {
right -= 1
}
arr[left] = arr[right] // 将这个元素"左移"
// 从序列左边往右边找,直到找到比基准大的元素才退出循环
for ; left < right && arr[left] <= temp; {
left += 1
}
arr[right] = arr[left] // 将这个元素"右移"
}
arr[left] = temp // 相当于将基准元素放到"中间",此时基准元素左边都是小于基准元素的元素,右边同理
return left
} func main() {
arr := []int{5, 17, 1, 68, 22}
fmt.Println("排序前:", arr)
QuickSort(arr)
fmt.Println("排序后:", arr)
}

Go:排序算法的更多相关文章

  1. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  2. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  3. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  4. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

  5. 排序算法----基数排序(RadixSort(L,max))单链表版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  6. 排序算法汇总(C/C++实现)

    前言:     本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...

  7. 用Java来写常见的排序算法

    随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...

  8. 模板化的七种排序算法,适用于T* vector<T>以及list<T>

    最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...

  9. 排序算法总结第二弹----冒泡排序---javascript描述

    上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...

  10. 排序算法总结------选择排序 ---javascript描述

    每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...

随机推荐

  1. 风速风向 UV 相互转换

    这里以c#为例将风的uv分量转成风向风速(别的语言类似) 风向是以y轴正方向为零度顺时针转 UV转风速风向 1 double v ;//v分量 2 double u;//u分量 3 double fx ...

  2. 12天,这本《重学Java设计模式》PDF书籍下载量9k,新增粉丝1400人,Github上全球推荐榜!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言

  3. HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第5章CSS盒子模型

    本教程案例在线演示 有路网PC端 有路网移动端 教程配套源码资源 教程配套源码资源 div div 可定义文档中的分区(division). div 标签可以把网页分割为独立的.不同的部分. 可以看成 ...

  4. Python三角函数

    Python三角函数: 函数: ''' math.sin(x) 返回的x弧度的正弦值. math.asin(x) 返回x的反正弦弧度值. math.cos(x) 返回x的弧度的余弦值. math.ac ...

  5. PHP array_udiff_uassoc() 函数

    实例 比较两个数组的键名和键值(使用用户自定义函数进行比较),并返回差集: <?phpfunction myfunction_key($a,$b){if ($a===$b){return 0;} ...

  6. PHP jdtojewish() 函数

    ------------恢复内容开始------------ 实例 把儒略日计数转换为犹太历法的日期: <?php$jd=jdtojewish(1789430); echo $jd;?> ...

  7. PDO::quote

    PDO::quote — 为SQL语句中的字符串添加引号.(PHP 5 >= 5.1.0, PECL pdo >= 0.2.1) 说明 语法 public string PDO::quot ...

  8. day2. 六大基本数据类型简介

    一.基本数据类型 Number 数字类型 (int float bool complex) str 字符串类型 list 列表类型 tuple 元组类型 set 集合类型 dict 字典类型 二.Nu ...

  9. 【小白学AI】八种应对样本不均衡的策略

    文章来自:微信公众号[机器学习炼丹术] 目录 1 什么是非均衡 2 8种解决办法 2.1 重采样(四种方法) 2.2 调整损失函数 2.3 异常值检测框架 2.4 二分类变成多分类 2.5 EasyE ...

  10. 7月13日考试 题解(DFS序+期望+线段树优化建图)

    T1 sign 题目大意:给出一棵 N 个节点的树,求所有起点为叶节点的有向路径,其 上每一条边权值和的和.N<=10000 水题.考试的时候毒瘤出题人(学长orz)把读入顺序改了一下,于是很多 ...