五种基础排序算法对比


五种基础排序算法对比

1:冒泡排序

算法描述
  • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  • 针对所有的元素重复以上的步骤,除了最后一个;
  • 重复步骤1~3,直到排序完成。
动图演示

冒泡排序
代码演示
func bubbleSort(arr []int) []int {
 if len(arr) <= 1 {
  return arr
 }
 for e := len(arr) - 1; e > 0; e-- {
  for i := 0; i < e; i++ {
   if arr[i] > arr[i+1] {
    Swap(arr, i, i+1)  //交换元素
   }
  }
 }
 return arr
}

func Swap(arr []int, i, j int) []int {
 temp := arr[j]
 arr[j] = arr[i]
 arr[i] = temp
 return arr
}

2:选择排序

算法描述

n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:

  • 将假想墙放置在数字列表最左侧,墙的左侧为已排序子列表,右侧为未排序子列表;
  • 找出(选择)未排序子列表中的最小(或最大)元素;
  • 把选择的元素与未排序列表中第一个元素进行交换;
  • 将假想墙向右移动一个位置;
  • 反复执行 2 至 4 步操作,直至整个数字列表排序完成(需要 n - 1 轮)。
动图演示

选择排序
代码演示
func selectSort(arr []int) []int {
 if len(arr) <= 1 {
  return arr
 }

 for i := 0; i < len(arr); i++ {
  var minIndex int = i
  for j := i + 1; j < len(arr); j++ {
   if arr[j] < arr[minIndex] {
    minIndex = j
   }
  }
  arr = Swap(arr, i, minIndex)
 }
 return arr

}

3:插入排序

算法描述

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

  • 从第一个元素开始,该元素可以认为已经被排序;
  • 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
    将新元素插入到该位置后;
  • 重复步骤2~5。
动图演示

插入排序
代码实现
func insertSort(arr []int) []int {
 if len(arr) <= 1 {
  return arr
 }
 for i := 1; i < len(arr); i++ {
  for j := i - 1; j >= 0; j-- {
   if arr[j] > arr[j+1] {
    Swap(arr, j, j+1)
   }
  }
 }
 return arr
}

4:快速排序

算法描述

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
动图演示

快速排序
代码实现
//快速排序
func quickSort(arr []int) []int {
 if len(arr) <= 1 {
  return arr
 }
 middle := arr[0]
 var left []int
 var right []int
 for i := 1; i < len(arr); i++ {
  if arr[i] > middle {
   right = append(right, arr[i])
  } else {
   left = append(left, arr[i])
  }
 }

 middle_s := []int{middle}
 left = quickSort(left)
 right = quickSort(right)
 arr = append(append(left, middle_s...), right...)
 return arr
}

欢迎关注我的公众号,程序员小饭,下期见~

常见排序算法的golang 实现的更多相关文章

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

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

  2. JS常见排序算法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. JavaScript版几种常见排序算法

    今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...

  4. 常见排序算法(JS版)

    常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...

  5. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  6. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

  7. python——常见排序算法解析

    算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序, ...

  8. 常见排序算法总结 -- java实现

    常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...

  9. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

随机推荐

  1. 在 VC 下清空键盘缓冲区的方法

    控制台窗口是有输入缓冲区的,当你按键后程序没有来得及处理,系统会将按键缓存,等到程序获取按键的时候,系统会把缓冲区里面之前的按键返回. // 调用控制台 API,清空之前缓冲区内的所有按键. Flus ...

  2. html5手机页面的那些meta

    一.普通手机页的设置1.<meta name="viewport" content=""/>说明:屏幕的缩放 content的几个属性: width ...

  3. HTML5摇一摇(上)—如何判断设备摇动

    刚刚过去的一年里基于微信的H5营销可谓是十分火爆,通过转发朋友圈带来的病毒式传播效果相信大家都不太陌生吧,刚好最近农历新年将至,我就拿一个"摇签"的小例子来谈一谈HTML5中如何调 ...

  4. Node自动重启工具 nodemon

    为什么要使用 在编写调试Node.js项目,修改代码后,需要频繁的手动close掉,然后再重新启动,非常繁琐.现在,我们可以使用nodemon这个工具,它的作用是监听代码文件的变动,当代码改变之后,自 ...

  5. 写入MySQL中文乱码问题

    相信使用数据库进行存储的大家都遇到过中文乱码问题,如何彻底解决?我百度了很多资料与博客,想把自己的经历总结起来给大家参考一下,接下来我先罗列一下大部分修改乱码问题的方法: 1.   修改MySQL数据 ...

  6. pip 和 Conda 镜像站配置

    如果你经常使用 Python,那么你对 pip 和 Conda 一定不陌生,它们作为包管理器,可以非常方便的帮助我们下载需要的 Python 包,但是受限于大多 Python 包的服务器在国外,国内下 ...

  7. SpringMVC注解环境搭建

    基本步骤 新建Maven项目(Web) 导入依赖 配置web.xml 配置springmvc配置文件 编写Controller 创建view页面 部署并启动Tomcat 开始搭建 新建Maven项目( ...

  8. Mysql各版本号的含义

    1)MySQL Community Server 社区版本,开源免费,但不提供官方技术支持2)MySQL Enterprise Edition企业版本,需付费,可以试用30天3)MySQL Clust ...

  9. mysql HikariCP连接池配置

    #连接池配置 #最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size spring.datasource.hikari.minimum ...

  10. Unity—2D边缘检测(描边效果)

    一.ShaderLab 1.Alpha值边缘检测 根据图片的Alpha值边缘判定,向内扩一段距离做边缘,颜色设置未描边颜色: 片元着色阶段,向上下左右四个方向做检测,有一个点的透明度为0,判定为边缘: ...