软考系列——排序算法盘点

来源:互联网 发布:新网域名转移到万网 编辑:程序博客网 时间:2024/06/05 23:44

  所谓排序,就是按照关键字递增或递减次序排列起来。本文将会从四个方面来分析各个排序方法:逻辑、时间复杂度、稳定性评价、代码与图。开始之前,要知道以下三个定义。


  时间复杂度:预计算法的运算时间。

  稳定的:若存在多个关键字相同记录,排序后,相同关键字的记录之间的相对次序保持不变,则称其为稳定的。

  不稳定的:若具有相同关键字的记录之间的相对次序发生变化,则称其为不稳定的。


  下面是一张算法的分类图,本文会按照此顺序一一讲解。




1.插入排序

1.1.直接插入


基本思想:

  依次将每个记录插入到一个已排好的有序表中去,从而得到一个新的、记录数增加1的有序表。其中有i个记录,记录R[0]有两个作用:一是防止丢失指针指向的值,二是防止越界,不用判断循环条件。


时间复杂度:

 最好的情况:正序有序,这样只需要比较N次,不需要移动,所以时间复杂度为O(n)

 最坏的情况:逆序有序,这样每一个数需要比较N次,一共有N个元素,所以时间复杂度为O(n­2

 平均情况:O(n­2)


稳定性:

  是稳定的。直接插入排序是一个有序表和一个无序表,如果A和B是两个相同的数字,那么当A和B进行比较的时候,直接插入到A的后边,没有必要去移动位置,所以是稳定的。



1.2.Shell排序

  
  基本思想:缩小增量排序,在直接插入排序上的一个改进。每趟都按照确定的间隔将元素进行分组,在每一组中进行直接插入排序,使得小的数可以跳跃式的前进。然后逐步的将步长缩小,直到步长为1...等到序列基本有序,进行直接插入排序。


时间复杂度:
 
 最好情况:shell排序的好坏与步长的选择有关系,目前不知道最好的步长如何选,所以不知道最好的时间复杂度。
 最坏情况:O(N*logN)
 平均情况O(N*logN)

稳定性:

  不稳定的。相同的数会在自己的组内进行插入排序的移动,因此稳定性就会被破坏。


2.交换排序

2.1.快速排序


  基本思想:采用分治法,把大的问题进行分解。在N个记录中去某一个记录的键值为标准,通常取第一个记录键值为标准,通过一趟排序将待排的记录分为小于或等于这个键值和大于这个键值的两个独立的部分,这时一部分的记录键值均比另一部分小,然后对着两部分记录继续分别进行快速排序,已达到整个序列的有序。



时间复杂度:

 最好情况:每次都将序列分为两个部分,故为 O(N*log2N)
 最坏情况:基本有序时,退化为冒泡排序,几乎要比较N*N次,故为O(N*N)
 平均情况: O(N*log2N)

稳定性:

  不稳定。每次需要和基准交换,原来顺序一定会被打乱。

2.2.冒泡排序


基本思想:采用从最后一个数据依次向前比较,找出最小的一个来。每次都是和相邻的交换位置。



时间复杂度:
 
 最好情况:正序有序,则只需要比较n次。故,为O(n)
 最坏情况:逆序有序,则需要比较(n-1)+(n-2)+……+1,故,为O(N^2)
 平均情况:(N^2)

稳定性:稳定。排序过程中只交换相邻两个元素的位置。

3.选择排序

3.1.直接选择

  基本思想:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列




时间复杂度:
 最好情况:交换0次,但是每次都要找到最小的,遍历N*N次,因此为O(N*N)。
 最坏情况:O(N*N)
 平均情况:O(N*N)

稳定性:不稳定。相同的两个数会跨距离的进行交换。

3.2.堆排序

  基本思想:利用大顶锥的构建,使在无序记录中找最大值变得简单。

时间复杂度:
 最好情况:O(N*log2N)
 最坏情况:O(N*log2N)
 平均情况:O(N*log2N)

稳定性:不稳定。堆需要不断的进行调整。

4.归并

4.1.二路归并

  基本思想:将两个有序表合成一个有序表。


时间复杂度:
 最好情况:O(N*log2N)
 最坏情况:O(N*log2N)
 平均情况:O(N*log2N)

稳定性:稳定。不会改变元素的相对位置。

5.基数

5.1.基数排序


  基本思想:很简单不用比较的,按照个位排序,再按照十位排序,最后按照百位排序。

时间复杂度:
 最好情况:O(d(r+n))
 最坏情况:O(d(r+n))
 平均情况:O(d(r+n))

稳定性:稳定。不会改变元素的相对位置。

6.总结



   还需理解才能灵活掌握,关于时间复杂度还需要深入的去理解。


0 0