排序算法——冒泡排序

转载:http://www.cnblogs.com/luxiaoxun/archive/2012/09/01/2666677.html

冒泡排序方法是最简单的排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。
冒泡排序是稳定的。算法时间复杂度是O(n^2)。

 1 //冒泡排序(相邻比较法)
 2 void BubbleSort(int a[],int n)
 3 {
 4     int i,j;
 5     int temp;
 6     for(i = 0; i < n-1; i++)
 7         for(j = 0; j < n-i-1; j++)
 8             if(a[j] > a[j+1])
 9             {
10                 temp = a[j];
11                 a[j] = a[j+1];
12                 a[j+1] = temp;
13             }
14 }
15 //改进的冒泡排序
16 void ImprovedBubbleSort(int a[], int n)
17 {
18     int i,j;
19     int temp;
20     bool change = false;
21     for (i = 0; i < n-1; i++)
22     {
23         change = false;
24         for (j = 0; j < n-i-1; j++)
25         if (a[j] > a[j+1])
26         {
27             temp = a[j];
28             a[j] = a[j+1];
29             a[j+1] = temp;
30             change = true;
31         }
32         if ( !change ) break;
33     }
34 }
35 //双向冒泡排序
36 void CocktailSort(int a[], int n)
37 {
38     int top = n - 1;
39     int bottom = 0;
40     bool flag = true;
41     int i, j;
42     while(flag)
43     {
44         flag = false;
45         //从小到大,升序
46         for (i = bottom; i < top; i++)
47         {
48             if(a[i] > a[i+1])
49             {
50                 swap(a[i], a[i+1]);
51                 flag = true;
52             }
53         }
54         top--;
55 
56         //从大到小,降序
57         for(j = top; j > bottom; j--)
58         {
59             if(a[j] < a[j-1])
60             {
61                 swap(a[j], a[j-1]);
62                 flag = true;
63             }
64         }
65         bottom++;
66     }
67 }

 

posted @ 2012-10-08 14:52  三块钱的其其  阅读(206)  评论(0编辑  收藏  举报