排序
排序(sorting)的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。其确切的定义为:假设有n个数据元素的序列{R1 , R2 , … , Rn},其相应关键字的序列是{K1 , K2 , … , Kn},通过排序要求找出下标 1 , 2 , … , n的一种排列p1 , p2 , … , pn,使得相应关键字满足如下的非递减(或非递增)关系 Kp1 ≤ Kp2 ≤ … ≤ Kpn 这样,就得到一个按关键字有序的纪录序列:{ Rp1 , Rp2 , … , Rpn }。
数据元素数量的不同,使得排序过程中涉及的存储器不同,可以将排序方法分为两类。一类是整个排序过程在内存储器中进行,称为内部排序;另一类是由于待排序元素数量太大,以至于内存储器无法容纳全部数据,排序需要借助外部存储设备才能完成,这类排序称为外部排序。
如果在待排序的序列中存在多个具有相同关键字的元素。假设Ki=Kj(1≤ i≤ n,1≤ j≤ n,i≠j),若在排序之前的序列中Ri在Rj之前,经过排序后得到的序列中Ri仍然在Rj之前,则称所用的排序方法是稳定的;否则,当相同关键字元素的前后关系在排序中发生变化,则称所用的排序方法是不稳定的。
无论是稳定的还是不稳定的排序方法,均能完成排序的功能。在某些场合可能对排序有稳定性的要求,此时就应当选择稳定的排序方法。例如,假设一组学生纪录已经按照学号有序,现在需要根据学生的成绩排序,当分数相同时要求学号小的学生在前,显然此时对分数
进行排序就必须选择稳定的排序方法。
通常,在排序的过程中需要进行两种基本操作:⑴比较两个关键字的大小;⑵将一个关键字从一个位置移动到另一个位置。第一种操作对大多数排序方法来说都是必要的,而后一种操作可以通过改变记录的存储方式来予以避免。内部排序的方法很多,但是很难说哪一种内部排序方法最好,每一种方法都有各自的优缺点,适合于不同的环境下使用。如果按照排序过程中依据的原则对内部排序进行分类,则
大致上可以分为插入排序、交换排序、选择排序、归并排序等排序方法。
分类
排序算法按照类型可以分为插入排序、选择排序、交换排序、归并排序等几大类。其中:
插入排序:直接插入排序、折半插入排序(二分插入排序)、希尔排序。
选择排序:简单选择排序、树形选择排序、堆排序。
更详细的分类如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/71fea7796c476b68b753aba250de0bbd.png)
各类排序算法的性能比较如下:
![](https://i-blog.csdnimg.cn/blog_migrate/30b8af45dca3ee5cb700788d6cddde72.png)
时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。