冒泡排序的原理:可以从最后一个元素开始,依次比较相邻两个元素,较小的数往上冒,一次循环结束,最小的元素上升到首位置,然后继续这样比较剩下的n-1个元素。
冒泡排序及其优化
1 #include <iostream>
2 using namespace std;
3
4
5 //元素交换
6 void swap(int &a,int &b)
7 {
8 int temp=a;
9 a=b;
10 b=temp;
11 }
12
13 /*///////////////////////////////////////////////
14 冒泡排序(未优化版本)
15 */
16 void BubbleSort(int *a,int len)
17 {
18 int i,j;
19 for(i=0;i<len;i++)
20 {
21 for(j=len-1;j>i;j--)
22 {
23 if(a[j]<a[j-1])
24 swap(a[j],a[j-1]);
25 }
26 }
27 for(i=0;i<len;i++)
28 cout<<a[i]<<" ";
29 cout<<endl;
30 }
31 /////////////////////////////////////////////////
32
33
34 /*///////////////////////////////////////////////
35 优化冒泡排序方法1
36 用j获取最后一次元素交换的位置pos,用来改变每次循环的范围
37 */
38 void BubbleSort(int *a,int len)
39 {
40 int i,j=len-1,pos;
41 while(j>0)
42 {
43 pos=0;
44 for(i=0;i<j;i++)
45 {
46 if(a[i]>a[i+1])
47 {
48 swap(a[i],a[i+1]);
49 pos=i;
50 }
51 }
52 j=pos;
53 }
54 for(i=0;i<len;i++)
55 cout<<a[i]<<" ";
56 cout<<endl;
57 }
58 /////////////////////////////////////////////////
59
60
61 /*///////////////////////////////////////////////
62 优化冒泡排序方法2(就是添加一个标志位,比较容易理解)
63 设置标志位,用于判断一次冒泡排序中是否有交换元素,
64 若没有,则表示已排序好。
65 */
66 void BubbleSort(int *a,int len)
67 {
68 int i,j;
69 bool flag = false;
70 for(i=0;i<len;i++)
71 {
72 for(j=len-1;j>i;j--)
73 {
74 if(a[j]<a[j-1])
75 {
76 swap(a[j],a[j-1]);
77 flag = true;
78 }
79 }
80 if(flag == false)
81 break;
82 }
83 for(i=0;i<len;i++)
84 cout<<a[i]<<" ";
85 cout<<endl;
86 }
87 ////////////////////////////////////////////
88
89
90
91 int main()
92 {
93 int n,i,a[20];
94 cout<<"请输入数组元素n:"<<endl;
95 cin>>n;
96 cout<<"请输入"<<n<<"个元素:"<<endl;
97 for(i=0;i<n;i++)
98 cin>>a[i];
99 BubbleSort(a,n);
100 return 0;
101 }
最好的情况下,即数组本身是排序好的,这时进行n-1次比较,时间复杂度为O(n);最坏的情况下,即数组是逆序的,需要比较次数为:1+2+3+…+(n-1)=n(n-1)/2,推导出时间复杂度为O(n^2)。