排序算法

Catalogue   

插入排序

直接插入排序

具体算法:

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

希尔排序

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。

希尔排序实质上是一种分组直接插入方法。

基本思想:

对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;
然后,对各组内的元素进行直接插入排序。 这一趟排序完成之后,每一个组的元素都是有序的。
然后减小gap的值,并重复执行上述的分组和排序。重复这样的操作,当gap=1时,即所有记录放在同一组中进行直接插入排序为止, 整个数列就是有序的。


选择排序

直接选择排序

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

堆选择排序

什么是堆?

堆结构有很多种,如二叉堆、B堆、斐波那契堆、三元堆,树堆、弱堆等。
二叉堆是堆实现中最流行的一种。二叉堆是一个完全二叉树,树的所有内部节点都被完全填充,最后一层可以完全填充的或部分填充。通俗的说,堆(二叉堆)可以视为一棵
完全的二叉树。完全二叉树的一个优秀的性质就是,除了最底层之外,每一层都是满的。堆又分为最大堆(堆顶Root是最大值)和最小堆(堆顶Root是最小值)。

总结一下,只要你是一个完全二叉树,父节点又大于子节点,你就是堆。

完全二叉树 + 父节点大于(或小于)子节点 = 堆

https://chihokyo.com/post/18/


交换排序

冒泡排序

从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继续这个过程,
直到所有数据元素都排好序。

快速排序


归并排序

归并排序算法完全遵循分治模式。直观上其操作如下:

分解:分解等排序的n个元素的序列成各具n/2个元素的两个子序列;
解决:使用归并排序递归地排序两个子序列;
合并:合并两个已排序的子序列以产生已排序的答案。


各种内排序方法的比较