排序算法稳定性

来源:互联网 发布:手机双桌面软件 编辑:程序博客网 时间:2024/05/22 10:36

概念:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

判断方法:对于不稳定的排序算法,只要举出一个实例,即可说明它的不稳定性;而对于稳定的排序算法,必须对算法进行分析从而得到稳定的特性。需要注意的是,排序算法是否为稳定的是由具体算法决定的,不稳定的算法在某种条件下可以变为稳定的算法,而稳定的算法在某种条件下也可以变为不稳定的算法。

  例如,对于如下起泡排序算法,原本是稳定的排序算法,如果将记录交换的条件改成r[j]>=r[j+1],则两个相等的记录就会交换位置,从而变成不稳定的算法。

  void BubbleSort(int r[ ], int n){

  exchange=n; //第一趟起泡排序的范围是r[1]到r[n]

  while (exchange) //仅当上一趟排序有记录交换才进行本趟排序

  {

  bound=exchange; exchange=0;

  for (j=1; j if (r[j]>r[j+1]) {

  r[j]←→r[j+1];

  exchange=j; //记录每一次发生记录交换的位置

  }

  }

  }

  再如,快速排序原本是不稳定的排序方法,但若待排序记录中只有一组具有相同关键码的记录,而选择的轴值恰好是这组相同关键码中的一个,此时的快速排序就是稳定的。

常见排序算法的稳定性  快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法