深入浅出理解排序算法系列(一) 排序算法概述

概述: 

     排序(又称分类、整序)是指将无序序列排成一个有序序列由小到大或由大到小)的运算。用于作为排序依据的数据项称为关键词,也就说排序算法是基于关键词从小到大或从大到小进行排序的。

本系列的文章包含:

1、排序算法概述

2、插入排序的实现方法及性能分析

3、交换排序的实现方法及性能分析

4、选择排序的实现方法及性能分析

5、归并排序的实现方法及性能分析

6、基数排序的实现方法及性能分析

7、总结:各种内部排序方法的比较

(注:先列出框架,后续不断更新中)


本文作者:Horace_hr       

作者博客地址:https://blog.csdn.net/Horace_hr

本文地址:https://blog.csdn.net/Horace_hr/article/details/81518142(转载请标明出处,谢谢!)


一、排序的分类

1、内部排序和外部排序

深入浅出理解排序算法系列(一) 排序算法概述

   排序按存储器的不同(外部存储、内部存储)分为内部排序和外部排序。我们常见的排序算法多指的是内部排序,即待排序序列完全存放在内存中的排序过程。当然,内部排序适用于数据量较少的元素排序。

2、稳定排序和不稳定排序

   当我们使用某种排序算法对既定一组数据元素序列排序之后,如果相同的两个数据元素的前后关系位置在排序前和排序后保持一致时,我们称此排序为稳定排序,反之不稳定排序。通俗来讲,如果Ai = Aj(i<j),Ai原来的位置在Aj前面,经过某种算法排序后Ai还是在Aj位置前,那么这种算法就是稳定排序算法。

二、内排序的方法

内排序主要有比较排序和基数排序两大类,每个类又有不同类型的排序方法,如下图:

深入浅出理解排序算法系列(一) 排序算法概述

我们先从算法名称上了解不同类型的算法的含义:

  1. 插入类型排序:将无序子序列中的一个或多个元素插入有序序列中,增加有序序列的长度
  2. 交换类型排序:交换无序序列中的元素,得到较大或较小的元素,按照排序顺序加入到有序序列中,增加有序序列的长度
  3. 选择类型排序:从无序子序列中选择最大或最小的元素,将其加入到有序序列中,增加有序序列的长度
  4. 归并类型排序:归并两个或两个以上的有序子序列,增加有序序列的长度

      小伙伴们不用担心难理解,其实这和排序的含义是相通的,你想想看,排序就是将元素序列从无序变为有序的过程,在这个变化过程中,无序序列逐缩减,有序序列逐渐变长,直至整个序列变为有序序列,排序算法才算完成。不管使用什么具体的算法来操作排序过程,目的都是一样的——实现数据有序排列。

    下面我们来了解每种类型算法的具体排序算法,这里列举是常见的8中排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序,当然还有其他的各种具体的排序算法,此处不再赘述。

1)比较排序:

  • 插入排序:直接插入排序、希尔排序
  • 交换排序:冒泡排序、快速排序
  • 选择排序:直接选择排序、堆排序
  • 归并排序:(又称合并排序)

2)基数排序(又称桶排序、串排序、字典排序)

三、排序算法性能的对比

每种算法的实现方法以及性能分析将会在本系列文章中的后续篇幅详细讲解,此处只展示每种算法的性能:

深入浅出理解排序算法系列(一) 排序算法概述

      评价排序算法的好坏的标准主要是算法的时间复杂度空间复杂度 ,需要指出的是,排序算法的时间可以用算法执行的过程中的元素比较次数移动次数来衡量,通过最少的比较和移动来达到最终结果的算法,往往是好的算法。

 四、小结

   没有一种完美的排序算法,只有适合更适合使用场景的排序算法,选择合适的排序算法需要考虑:待排序的数据元素数目、稳定性、时间复杂性、空间复杂性等。接下的系列文章将会对各种内部排序算法进行详细分析讲解,并针对实际问题给出选择合适排序方法的建议。

注:本文还在不断更新中......


引用

本文参考资料为《数据结构——Java语言描述》清华大学出版社以及中国大学MOOC《数据结构》(陈卫卫老师主讲)

请各位小伙伴不吝赐教,多多批评!