代码改变世界

排序:冒泡排序

2013-02-25 21:25  gitenius  阅读(302)  评论(0编辑  收藏  举报

冒泡排序的基本概念:依次比较相邻的两个数,将小数放在前面,大数放在后面。

一:时间复杂度

第一趟:比较第1个和第2个数,将小数放前,大数放后面

比较第2个和第3个数,…

比较第3个和第4个数,…

比较第n-1个和第n个数,…

共比较n-1次

第二趟:比较第1个和第2个数,将小数放前,大数放后面

比较第2个和第3个数,…

比较第3个和第4个数,…

比较第n-2个和第n-1个数

共比较n-2次

...

第M趟:比较第1个和第2个数,将小数放前,大数放后面

比较第2个和第3个数,…

比较第3个和第4个数,…

比较第n-M个和第n-M+1个数

共比较n-M次

...

在最好(正序)的情况下:冒泡排序进行一趟排序,总比较次数n-1;

在最坏(逆序)的情况下:n个数排序后,共需比较(n-1)+(n-2)+…+(n-M)+…+1=n(n-1)/2次

因此,冒泡排序总的时间复杂度:O(n*n)

二:算法稳定性

冒泡排序是具有稳定性的算法,即原序列中相同元素的相对顺序仍然保持到排序后的序列。

原序列:
 05  33  08  10 
20
  55  89  61  80  98  
20
  26 
排序中:
 05  08  10  
20
  33  55  61  80  89  
20
  26  98 
 05  08  10  
20
  33  55  61  80  
20
  26  89  98 
 05  08  10  
20
  33  55  61  
20
  26  80  89  98 
 05  08  10  
20
  33  55  
20
  26  61  80  89  98 
 05  08  10  
20
  33  
20
  26  55  61  80  89  98 
 05  08  10  
2020
  26  33  55  61  80  89  98 
 05  08  10  
2020
  26  33  55  61  80  89  98 
 05  08  10  
2020
  26  33  55  61  80  89  98 
 05  08  10  
2020
  26  33  55  61  80  89  98 
 05  08  10  
2020
  26  33  55  61  80  89  98 
 05  08  10  
2020
  26  33  55  61  80  89  98 
排序后:
 05  08  10  
2020
  26  33  55  61  80  89  98 
 
以上所示是:排序前后
20
20
的相对顺序保持不变。

三:示例代码

冒泡排序的相关代码:

   1:  public class BubbleSortLib
   2:      {
   3:          public int[] Sort(int[] arr)
   4:          {
   5:              for (int outer = arr.Length - 1; outer > 0; outer--)
   6:              {
   7:                  for (int inner = 0; inner < outer; inner++)
   8:                  {
   9:                      if (arr[inner] > arr[inner + 1])
  10:                      {
  11:                          int temp = arr[inner];
  12:                          arr[inner] = arr[inner + 1];
  13:                          arr[inner + 1] = temp;
  14:                      }
  15:                  }
  16:              }
  17:              return arr;
  18:          }