排序算法之冒泡排序

来源:互联网 发布:系统数据保密协议 编辑:程序博客网 时间:2024/06/06 16:34

一、冒泡排序算法

  冒泡排序(Buddle Sort)作为一种交换排序算法,基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止。

  冒泡排序算法步骤:(从后往前)

  1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  3.针对所有的元素重复以上的步骤,除了最后一个。

  4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 

  冒泡排序算法代码如下:     

<pre name="code" class="cpp">/* 对顺序表L做冒泡排序*/Void BuddleSort1(SqList*L){   int i,j;   for(i=1;i<L->length;i++)   {        for(j=L->length;j>=i;j--)        {            if(L->r[j] > L->r[j+1])            {                swap(L,j,j+1);            }         }   } }

  假定待排序的关键字为{9,1,5,8,3,7,4,6,2}。

  当i=1时,j从j=8遍历至j=1,将较小值通过交换移到前面,直到最后找到最小值放在最顶的位置为止。如图1所示。

                                                        

                                                        图1 i=1时将最小值1冒泡到最顶端

  当i=2时,j从j=8遍历至j=2,将较小值通过交换移到前面,直到最后找到最小值放在最顶的位置为止。如图2所示。

                                                                     

                                                   图2 i=2时将关键字值2冒泡到第二位置

  依次循环i=3,i=4........i=9,经过上述9次排序,整个关键字序列就会变成从上到下由小到大排列的有序数列。

二、冒泡排序算法的优化

  如果我们的排序序列为{2,1,3,4,5,6,7,8,9},观察整个序列除了第一个和第二个关键字外,后面的序列已为正常顺序,因此在这里最理想的排序也就是交换第一和第二的位置,但是依照上述冒泡排序算法i=1,2.....9以及每一个循环中的j都将执行一遍,显然在这里是多余的。

  这里我们采用增加标记变量flag来实现这一算法的改进。  

/* 对顺序表L做改进冒泡算法*/void BuddleSort2(SqList *L){   int i,j;   Status flag=true;   for(i=1;i<L->length && flag;i++)   {       Flag=FALSE;      for(j=L->length-1;j>=i;j--)  {      if(L->r[j] > L->r[j+1])  {swap(L,j,j+1);Flag=TRUE;  }  }   }   }

  改进的冒泡排序算法相比较常规的冒泡排序算法而言,在i变量的for循环中,增加了对flag是否为true的判断。

三、冒泡排序算法的复杂度分析

  最好情况,若记录序列的初始状态为"正序",则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;最坏情况若记录序列的初始状态为"逆序",则需进行n(n-1)/2次比较和记录移动。因此冒泡排序总的时间复杂度为O(n*n)。

1 0
原创粉丝点击