冒泡排序

来源:互联网 发布:java用户菜单权限源码 编辑:程序博客网 时间:2024/06/03 19:37

本文转自:点击打开链接

一. 算法描述

    冒泡排序:依次比较相邻的数据,将小数据放在前,大数据放在后;即第一趟先比较第1个和第2个数,大数在后,小数在前,再比较第2个数与第3个数,大数在后,小数在前,以此类推则将最大的数"滚动"到最后一个位置;第二趟则将次大的数滚动到倒数第二个位置......第n-1(n为无序数据的个数)趟即能完成排序。

以下面5个无序的数据为例:

40 8 15 18 12 (文中仅细化了第一趟的比较过程)

第1趟: 8 15 18 12 40


第2趟: 8 15 12 18 40

第3趟: 8 12 15 18 40

第4趟: 8 12 15 18 40

二. 算法分析

平均时间复杂度:O(n2)

空间复杂度:O(1)  (用于交换)

稳定性:稳定

三. 算法实现

[cpp] view plaincopy
  1. //交换data1和data2所指向的整形  
  2. void DataSwap(int* data1, int* data2)  
  3. {  
  4.     int temp = *data1;  
  5.     *data1 = *data2;  
  6.     *data2 = temp;  
  7. }  
  8.   
  9. /******************************************************** 
  10. *函数名称:BubbleSort 
  11. *参数说明:pDataArray 无序数组; 
  12. *          iDataNum为无序数据个数 
  13. *说明:    冒泡排序 
  14. *********************************************************/  
  15. void BubbleSort(int* pDataArray, int iDataNum)  
  16. {  
  17.     for (int i = 0; i < iDataNum - 1; i++)   //走iDataNum-1趟  
  18.         for (int j = 0; j < iDataNum - i - 1; j++)      
  19.             if (pDataArray[j] > pDataArray[j + 1])  
  20.                 DataSwap(&pDataArray[j], &pDataArray[j + 1]);  
  21. }  

四. 算法优化

还可以对冒泡排序算法进行简单的优化,用一个标记来记录在一趟的比较过程中是否存在交换,如果不存在交换则整个数组已经有序退出排序过程,反之则继续进行下一趟的比较。

[cpp] view plaincopy
  1. /******************************************************** 
  2. *函数名称:BubbleSort 
  3. *参数说明:pDataArray 无序数组; 
  4. *          iDataNum为无序数据个数 
  5. *说明:    冒泡排序 
  6. *********************************************************/  
  7. void BubbleSort(int* pDataArray, int iDataNum)  
  8. {  
  9.     BOOL flag = FALSE;    //记录是否存在交换  
  10.     for (int i = 0; i < iDataNum - 1; i++)    //走iDataNum-1趟  
  11.     {  
  12.         flag = FALSE;  
  13.         for (int j = 0; j < iDataNum - i - 1; j++)      
  14.             if (pDataArray[j] > pDataArray[j + 1])  
  15.             {  
  16.                 flag = TRUE;  
  17.                 DataSwap(&pDataArray[j], &pDataArray[j + 1]);  
  18.             }  
  19.           
  20.         if (!flag)    //上一趟比较中不存在交换,则退出排序  
  21.             break;  
  22.     }  
  23. }  
0 0