`
这些年
  • 浏览: 388434 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

zy19982004--数据结构与算法学习一:冒泡排序

 
阅读更多

一.排序方法

  1. 将被排列的数组data[0...n]垂直排列,每个元素data[i]看作是一个气泡,气泡的重量就是data[i]的值。
  2. 从最下面一个气泡data[n]开始扫描,比较其与上一个气泡data[n-1]的重量,data[n] < data[n-1]则交换;然后比较data[n-1]与data[n-1-1]...一轮下来,最轻的气泡跑到了最上面data[0]的位置。
  3. 重复2过程,让第二轻的气泡跑到data[1]的位置;再次重复...

 

二.动画演示

      http://student.zjzk.cn/course_ware/data_structure/web/flashhtml/maopaopaixu.htm

 

 

三.Java代码

 

Java代码  收藏代码
  1. public static int[] bubbleSort(int[] data) {  
  2.     int temp = 0;  
  3.     for(int i=0; i < data.length -1; i++) { //每一轮  
  4.         boolean exchange = false;           //每一轮设置一个是否有元素交换的标志  
  5.         int j = data.length -1;  
  6.         for(; j > i; j--) {  
  7.             if(data[j] < data[j-1]) {        //元素和上一个元素比较  
  8.                 temp = data[j];  
  9.                 data[j] = data[j-1];  
  10.                 data[j-1] = temp;  
  11.                 exchange = true;            //有元素交换  
  12.             }  
  13.         }  
  14.         if(!exchange) {                     //如果一轮下来,没有元素交换,说明data已经是排好序了,无需进行下一轮  
  15.             break;  
  16.         }  
  17.     }  
  18.     return data;  
  19. }  

 

 

四.时间复杂度和稳定性

  1.  最好时间复杂度
    1. 若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值。
    2. Cmin=n-1=O(n)
    3. Mmin=0
    4. 冒泡排序最好的时间复杂度为O(n)
  2. 最坏时间复杂度
    1. 若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值。
    2. Cmax=n(n-1)/2=O(n2)
    3. Mmax=3n(n-1)/2=O(n2)
    4. 冒泡排序的最坏时间复杂度为O(n2)
  3. 平均时间复杂度
    1. O(n2)
  4. 冒泡排序是就地排序,且它是稳定的。

五.算法优化

  1. 设置exchange标志。如果不设置,Cmin=n(n-1)/2=O(n2)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics