Chinaunix首页 | 论坛 | 博客
  • 博客访问: 146186
  • 博文数量: 37
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 352
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-08 10:56
文章存档

2015年(18)

2014年(6)

2013年(13)

我的朋友

分类: C/C++

2015-09-05 23:23:00

冒泡排序(Bubble Sort)
冒泡排序的基本思想:每次比较相邻的两个元素的值,将较小的数排列在较大的数前面。(从小到大排列)

原始待排序数组| 8 | 3 | 4 | 7 | 1 | 9 |
===================================================================
-------------------------------------------------------------------
第一趟排序(外循环1次,内循环5次)              外循环   for(i=0,i<6;i++)
    第一次两两比较,8 > 3交换(内循环)           j=0
        交换前状态| 8 | 3 | 4 | 7 | 1 | 9 |
        交换后状态| 3 | 8 | 4 | 7 | 1 | 9 |

    第二次两两比较,8 > 4交换                     j=1
        交换前状态| 3 | 8 | 4 | 7 | 1 | 9 |
        交换后状态| 3 | 4 | 8 | 7 | 1 | 9 |

    第三次两两比较,8 > 7交换                     j=2
        交换前状态| 3 | 8 | 4 | 7 | 1 | 9 |
        交换后状态| 3 | 4 | 7 | 8 | 1 | 9 |

    第四次两两比较,8 > 1交换                    j=3
        交换前状态| 3 | 4 | 7 | 8 | 1 | 9 |
        交换后状态| 3 | 4 | 7 | 1 | 8 | 9 |

    第五次两两比较,8 < 9不交换                 j=4
        交换前状态| 3 | 4 | 7 | 1 | 8 | 9 |
        交换后状态| 3 | 4 | 7 | 1 | 8 | 9 |
-------------------------------------------------------------------
第二趟排序(外循环1次,内循环4次)
    第一次两两比较3 < 4不交换
        交换前状态| 3 | 4 | 7 | 1 | 8 | 9 |
        交换后状态| 3 | 4 | 7 | 1 | 8 | 9 |
 
    第二次两两比较,4 < 7不交换
        交换前状态| 3 | 4 | 7 | 1 | 8 | 9 | 
        交换后状态| 3 | 4 | 7 | 1 | 8 | 9 |

    第三次两两比较,7 > 1交换
        交换前状态| 3 | 4 | 7 | 1 | 8 | 9 | 
        交换后状态| 3 | 4 | 1 | 7 | 8 | 9 |

    第四次两两比较,7 < 8不交换
        交换前状态| 3 | 4 | 1 | 7 | 8 | 9 |
        交换后状态| 3 | 4 | 1 | 7 | 8 | 9 |

-------------------------------------------------------------------
第三趟排序(外循环1次,内循环3次)
    第一次两两比较3 < 4 不交换
        交换后状态| 3 | 4 | 1 | 7 | 8 | 9 |
        交换后状态| 3 | 4 | 1 | 7 | 8 | 9 |

    第二次两两比较, 4 >1 交换
        交换后状态| 3 | 4 | 1 | 7 | 8 | 9 |
        交换后状态| 3 | 1 | 4 | 7 | 8 | 9 |

    第三次两两比较,4 < 7 不交换
        交换前状态| 3 | 1 | 4 | 7 | 8 | 9 |
        交换后状态| 3 | 1 | 4 | 7 | 8 | 9 |
-------------------------------------------------------------------
第四趟排序(外循环1次,内循环2次)
    第一次两两比较3 > 1 交换
        交换后状态| 3 | 1 | 4 | 7 | 8 | 9 |
        交换后状态| 1 | 3 | 4 | 7 | 8 | 9 |

    第二次两两比较, 3 < 4 不交换
        交换后状态| 1 | 3 | 4 | 7 | 8 | 9 |
        交换后状态| 1 | 3 | 4 | 7 | 8 | 9 |

-------------------------------------------------------------------
第五趟排序(外循环)无交换
====================================================================
排序完毕,输出最终结果| 1 | 3 | 4 | 7 | 8 | 9 |

循环规律:     当有N个数时,外循环总共需要循环N-1次,第一层循环含义为:需要遍历N-1次数组,才能将数组排好序。
                 第i次外循环时,内循环需要循环 N-i次,在第二层遍历中,我们只需对未排好序的那些待排位置进行遍历即可因此,我们第二层循环要解决的问题便是:待排序区域的起始和结尾位置。

即:
===================================================================================
正向的比较:在第i次循环时,a[n-1],a[n-2],a[n-3] ,……,a[n-i]已经排好序,a[0],a[1],……,a[n-i-1] 待排序
---------------------------------------------------------------------------------------------------------------------------------------------------------

void BubbleSortStoB(int A[],int num)        // 从数组开始向数组末尾遍历,正向比较

{

    int temp=0;

    for (int i=0;i<num-1;i++)

    {   

        for (int j=0;j<num-i-1;j++)          // 待排的数据为0,1,2,...,n-i-1 ,此处判断条件为j<num-i-1

        {

            if (A[j]>A[j+1])

            {

                  temp=A[j];

                  A[j]=A[j+1];

                  A[j+1]=temp;

            }

        }

}


===================================================================================
逆向的比较:在第i次循环时,a[0],a[1],……,a[n-i-1]已经排好序,a[n-1],a[n-2],a[n-3] ,……,a[n-i] 待排序
-----------------------------------------------------------------------------------------------------------------------------------------------------

void BubbleSortBtoS(int A[],int num)  // 从数组末尾向数组开始遍历,逆向遍历比较

{

        int temp=0;

        for (int i=0;i<num-1;i++)

        {

               for (int j=num-1;j>i;j--)    //  待排的数据为i,i+1,...num-1    此处判断条件为j>i

               {

                      if (A[j]<A[j-1])

                       {

                           temp=A[j];

                           A[j]=A[j-1];

                           A[j-1]=temp;

                       }

                }

      }

}
============================================

冒泡排序的时间复杂度:
   冒泡排序最好的时间复杂度  

     冒泡排序的最坏时间复杂度为
  ;

     冒泡排序总的平均时间复杂度为
  


阅读(1020) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~