交换排序------冒泡排序

泡排序是一种极其简单的排序算法,也是我所学的第一个排序算法。它重复地走访过要排序的元素,一次比较相邻两个元素,如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端。

  冒泡排序算法的运作如下:

  1. 比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

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

  稳定性  

      排序过程中只交换相邻两个元素的位置。因此,当两个数相等时,是没必要交换两个数的位置的。所以,它们的相对位置并没有改变,冒泡排序算法是稳定的

 

  由于它的简洁,冒泡排序通常被用来对于程序设计入门的学生介绍算法的概念。冒泡排序的代码如下:

 

冒泡排序的改进:鸡尾酒排序

 鸡尾酒排序,也叫定向冒泡排序,是冒泡排序的一种改进。此算法与冒泡排序的不同处在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能。

  鸡尾酒排序的代码如下:

void BubbleSort(RecType R[] , int n)
{
    int left=0,right=n-1;   //边界初始化
    int i,j;
    RecType temp;
    while(left<right)
    {
        for(i=left;i<right;i++)                         // 前半轮,将最大元素放到后面
           if(R[i].key>R[i+1].key)
            {
                 temp=R[i];
                 R[i]=R[i+1];
                 R[i+1]=temp;
           }
          right--;

         for(i=right;i>left;i--)                         // 后半轮,将最小元素放到前面
           if(R[i].key<R[i-1].key)
            {
                 temp=R[i];
                 R[i]=R[i-1];
                 R[i-1]=temp;
           }
        left++;
     }
}

 

posted @ 2016-12-03 15:24  wj_hubei  阅读(281)  评论(0编辑  收藏  举报