总览

算法特征

排序方法

时间复杂度(平均)

时间复杂度(最坏)

时间复杂度(最好)

空间复杂度

稳定性

冒泡排序

O(n²)

O(n²)

O(n)

O(1)

稳定

选择排序

O(n²)

O(n²)

O(n)

O(1)

不稳定

插入排序

O(n²)

O(n²)

O(n)

O(1)

稳定

希尔排序

O(n^3/2)

O(n²)

O(n)

O(1)

不稳定

归并排序

O(nlogn)

O(nlogn)

O(nlogn)

O(n)

稳定

堆排序

O(nlogn)

O(nlogn)

O(nlogn)

O(1)

不稳定

快速排序

O(nlogn)

O(n²)

O(nlogn)

O(nlogn)

不稳定

计数排序

O(n+k)

O(n+k)

O(n+k)

O(n+k)

稳定

桶排序

O(n+k)

O(n²)

O(n)

O(n+k)

稳定

基数排序

O(n*k) 

O(n*k)

O(n*k)

O(n+k)

稳定

算法详解

冒泡排序

简述

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

代码实现

选择排序

简述

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

代码实现

插入排序

简述

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

insertion-sort.png

代码实现

希尔排序

简述

      是插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量

代码实现

归并排序

简述

该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序

分治法:将原问题分解为机构规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。

代码实现

堆排序

简述

    指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
关键步骤:
1、初始化一个堆

image.png


2、 输出堆顶元素之后,调整堆内元素,使其再次形成一个堆
   

image.png

代码实现

快速排序

简述

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

代码实现

计数排序

简述

核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

  • 找出待排序的数组中最大和最小的元素;
  • 统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
  • 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
  • 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

代码实现

桶排序

简述

桶排序是计数排序的升级版。如果每个桶的数据分布均匀,则最高效

  • 设置一个定量的数组当作空桶;
  • 遍历输入数据,并且把数据一个一个放到对应的桶里去;
  • 对每个不是空的桶进行排序;
  • 从不是空的桶里把排好序的数据拼接起来

代码实现

基数排序

简述

基数排序先收集到最大数,按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。

posted on 2018-07-02 15:19  vow007  阅读(4)  评论(0编辑  收藏  举报  来源