排序算法——冒泡排序
转载: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 }