转载地址:http://www2.gliet.edu.cn/jpkc/datastructure/course/course_content.asp?chapter_id=9&section_id=43



9.3交换排序

9.3.1冒泡排序

 冒泡排序又称起泡排序。其基本思想是先将数组中的第n-1个记录与第n-2个记录的关

键字值进行比较,如果第n-1个记录的关键字值小于第n-2个记录的关键字值,则两个记录

交换位置,否则不交换。然后比较第n-2个记录与第n-3个记录的关键字值,若第n-2个记

录的关键字值小于第n-3个记录的关键字值,两个记录交换位置,否则不交换,…,依此类

推,直到第1个记录与第0个记录进行比较。经过如此一趟的比较与交换,n个记录中关键

字值最小的记录就会被交换到数组的第0个位置。此后,再对数组中位置1~n-1的记录进行

同样的过程,使得n-1个记录中关键字值最小的记录被放到数组的第1个位置。然后再对

n-2个记录重复上述过程,…,直到某一趟排序过程中不出现记录交换位置,排序结束。由

于每一趟排序具有最小关键字值的记录就向数组的顶部移动。就象水底的“水泡”冒到水面

上一样,因此称为冒泡排序。图9.3给出了冒泡排序的工作过程。其C语言实现如下:

算法9.5

void bubblesort(ElemType a[],int n)

{

  int i,j;

  for (i=0;i<n-1;i++) 

   for (j = n-1;j>i;j--)

    if (key(a[j])<key(a[j-1])) 

      swap(a[j],a[j-1]);

 }


46  95  90  56  82  17  30  15


i =0  15  46 95 90 56 82 17 30


i = 1  15  17  46  95  90  56  82  30


i = 2  15  17  30  46  95  90  56  82


i = 3  15  17  30  46  56  95  90  82


i = 4  15  17  30  46  56  82  95  90


i = 5  15  17  30  46  56  82  90  95


i = 6  15  17  30  46  56  82  90  95


i = 7  15  17  30  46  56  82  90  95


图9.3 冒泡排序的工作过程


冒泡排序算法比较容易理解和编程,但它不是一个高效率的算法。不考虑数组中记录的

排列情况,冒泡排序的比较次数总将是i,因此冒泡排序的时间复杂性为:

 = O(n2) 

一个记录比它前一记录的关键字小的概率有多大决定了记录交换的次数。我们可以假定

这个概率为平均情况下比较次数的一半,因此冒泡排序算法交换记录的时间复杂性也为

O(n2)。