跳到主要内容

Go语言实现十大排序算法

· 阅读需 5 分钟
ahKevinXy

冒泡排序

原理

从左到右遍历数组,相邻元素两两进行比较。每次比较完一轮,就会找到数组中最大的一个或最小的一个。这个数就会从序列的最右边冒出来

选择排序

原理

首先在开始的时候遍历整个数组,找到序列中的最小元素,然后将这个元素与第一个元素交换,这样最小的元素就放到了它的最终位置上了,然后,从第二个元素开始遍历,找到剩下的n-1个元素中的最小元素,再与第二个元素进行交换。以此类推,直到最后一个元素放到了最终位

插入排序

原理

将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表,在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面的有序表进行待插入位置查找,并进行移动

快速排序

原理

快速排序要求我们选择一个基准,根据这个基准为原数组分组,比基准大的一组,比基准小的一组,再重复递归地进行快速排序,重新合并每组排序后的序列,即为排好序的序列

归并排序

原理

归并排序是采用分治法的一个典型的排序算法,将已有序的子序列合并为一个完全有序的序列。

归并排序的过程是:首先将序列拆分成子序列,然后对子序列进行排序,最后将排序好的子序列合并,就得到了一个有序的序列。

堆排序

原理

先来介绍一下什么是堆?堆是一种近似完全二叉树的数据结构,可以分为大根堆,小根堆。

接着我们来看一下堆排序的过程:

  1. 将待排序序列构造成一个大根堆,此时,整个数组的最大值就是堆结构顶端的根节点。
  2. 将堆根节点的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序序列个数为n-1。
  3. 将剩余的n-1个数再构造成一个大根堆,再将顶端数与n-1位置的数交换,如此反复执行,便能得到有序数组。

希尔排序

原理

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

计数排序

原理

计数排序是一种通过计数而不是比较进行排序的算法,适用于范围较小的整数序列。 它的优势在于在对一定范围内的整数排序时,时间复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。

桶排序

原理

将数组按照元素所属范围分到有限数量的桶里,再单独对每个桶排序(可以使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后依次把各个桶中的记录列出来记得到有序序列。

基数排序

原理

依次按照个位、十位、百位...的顺序对待排序数组分组,然后将每一次的分组按照索引大小重新组成新的数组。最后一轮的新数组即为排好序的数组

  1. 我们按照个位将待排序数组分组。
  2. 我们按照十位将待排序数组分组
  3. 我们按照百位将待排序数组分组。