一、冒泡排序

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. 将HTML5封装成android应用APK

    借鉴了网上很多的教程终于是把整个过程走通了,最主要的还是墙的问题.... 先是要搭建环境(每一步都要检查,确保安装正确): 1.安装 nodejs 淘宝镜像: npm install -g cnpm ...

  2. 破解东航的seriesid

    在查询东航航班的时候,请求数据中有个seriesid 调试js分析代码的过程就略过了,下面是整合的生成seriesid 的js代码 <script> function get_n(e, t ...

  3. 为什么switch不支持long

    switch 支持的类型 在 Java 语言规范里中,有说明 switch 支持的类型有:char.byte.short.int.Character.Byte.Short.Integer.String ...

  4. .net core编写转发服务(二) 添加服务发布订阅

    源设计就单纯完成了把服务转发到特定的服务模块,一定程度上解耦了业务流程 但是我们实际开发过程中会面临服务转发后还有一些列关联的服务 举个例子 你调用了发送邮件的服务,接下来会面临扣费的服务,扣费之后会 ...

  5. Linux学习笔记之linux软件包安装以及源的替换

    先是软件源的替换,在刚安装的Ubuntu中会配有原先的软件源,所以如果要替换时,可在网上找与自己ubuntu相对应的软件源,比如我的ubuntu版本为12.04,所以我得找到相对应能够适用Ubuntu ...

  6. IDEA的基本使用技巧

    博主在大学里学习的专业是计算机科学与技术,在大三的时候才开始接触 “加瓦”,学习加瓦首先就需要一个运行环境,因为受到了老师们的影响,我第一个编辑JAVA的软件环境便是Eclipse,在学校里学习和使用 ...

  7. 基于Socket访问西门子PLC系列教程(二)

    本文是西门子开放式TCP通信的第2篇,上一篇我们讲了使用西门子1200PLC作为TCP服务器的程序编写,可以点击下方链接阅读:[公众号dotNet工控上位机:thinger_swj] 基于Socket ...

  8. import android.support.annotation.NonNull;报错

    将import android.support.annotation.NonNull;换成import androidx.annotation.NonNull;

  9. docker找回构建时被删除的文件

    设想这样一个场景:当一个docker镜像被多次引用构建,在某次构建中某个文件被删除,如何找回被删除的文件? 要想回答这么一个问题,首先得熟悉下docker镜像的分层存储结构,镜像每一层都是只读的: 那 ...

  10. week4:周测错题

    4.如何在类外,给对象动态添加绑定方法 import types def qingtianzhu(obj,name): print("请我叫我一柱擎天,简称{},颜色是{}".fo ...