冒泡排序

对《大话数据结构》P378~P383—冒泡排序,进行了自己的理解并完善了代码。

三种冒泡排序如下:

1、冒泡排序初级版

代码和解释如下(VS2012测试通过):

 1 #include <iostream>
 2 using namespace std;
 3 #define MAXSIZE 5//用于要排序数组个数最大值,可根据需要修改
 4 
 5 //排序用的顺序表结构
 6 typedef struct
 7 {
 8     int r[MAXSIZE+1];//定义一个数组,用于存储要排序的数,r[0]作为临时变量
 9     int length;//用于记录顺序表的长度
10 }SqList;
11 
12 //排序表的初始化
13 SqList *InitSqList(SqList *L)
14 {
15     L=new SqList;
16     L->length=5;//本例中长度是5
17     cout<<"input list"<<endl;
18     for(int i=1;i<=L->length;i++)
19         cin>>L->r[i];
20     return L;
21 }
22 
23 //数组遍历输出
24 void PrintSqList(SqList *L)
25 {
26     for(int i=1;i<=L->length;i++)
27         cout<<L->r[i]<<" ";
28     cout<<endl;
29 }
30 
31 
32 //交换r[i]和r[j]
33 void swap(SqList *L,int i,int j)
34 {
35     int temp=L->r[i];
36     L->r[i]=L->r[j];
37     L->r[j]=temp;
38 }
39 
40 //冒泡排序初级版
41 void BubbleSort0(SqList *L)
42 {
43     for(int i=1;i<L->length;i++)
44     {
45         for(int j=i+1;j<=L->length;j++)
46         {
47             if(L->r[i]>L->r[j])
48                 swap(L,i,j);//交换顺序表中下标i和j的元素
49         }
50         cout<<"after one sort"<<endl;
51         PrintSqList(L);
52     }
53 }
54 
55 int main()
56 {
57     SqList *p=NULL;
58     p=InitSqList(p);//初始化
59     BubbleSort0(p);//排序
60     cout<<"after sort"<<endl;
61     PrintSqList(p);//输出
62 }

运行结果:

2、冒泡排序正宗版

代码和解释如下(VS2012测试通过):

 1 #include <iostream>
 2 using namespace std;
 3 #define MAXSIZE 5//用于要排序数组个数最大值,可根据需要修改
 4 
 5 //排序用的顺序表结构
 6 typedef struct
 7 {
 8     int r[MAXSIZE+1];//定义一个数组,用于存储要排序的数,r[0]作为临时变量
 9     int length;//用于记录顺序表的长度
10 }SqList;
11 
12 //排序表的初始化
13 SqList *InitSqList(SqList *L)
14 {
15     L=new SqList;
16     L->length=5;//本例中长度是5
17     cout<<"input list"<<endl;
18     for(int i=1;i<=L->length;i++)
19         cin>>L->r[i];
20     return L;
21 }
22 
23 //数组遍历输出
24 void PrintSqList(SqList *L)
25 {
26     for(int i=1;i<=L->length;i++)
27         cout<<L->r[i]<<" ";
28     cout<<endl;
29 }
30 
31 
32 //交换r[i]和r[j]
33 void swap(SqList *L,int i,int j)
34 {
35     int temp=L->r[i];
36     L->r[i]=L->r[j];
37     L->r[j]=temp;
38 }
39 
40 //冒泡排序正宗版
41 void BubbleSort(SqList *L)
42 {
43     for(int i=1;i<L->length;i++)
44     {
45         for(int j=L->length-1;j>=i;j--)
46         {
47             if(L->r[j]>L->r[j+1])
48                 swap(L,j,j+1);//交换顺序表中下标i和j的元素
49         }
50         cout<<"after one sort"<<endl;
51         PrintSqList(L);
52     }
53 }
54 
55 int main()
56 {
57     SqList *p=NULL;
58     p=InitSqList(p);//初始化
59     BubbleSort(p);//排序
60     cout<<"after sort"<<endl;
61     PrintSqList(p);//输出
62 }

运行结果:

3、冒泡排序优化版

代码和解释如下(VS2012测试通过):

 1 #include <iostream>
 2 using namespace std;
 3 #define MAXSIZE 5//用于要排序数组个数最大值,可根据需要修改
 4 
 5 //排序用的顺序表结构
 6 typedef struct
 7 {
 8     int r[MAXSIZE+1];//定义一个数组,用于存储要排序的数,r[0]作为临时变量
 9     int length;//用于记录顺序表的长度
10 }SqList;
11 
12 //排序表的初始化
13 SqList *InitSqList(SqList *L)
14 {
15     L=new SqList;
16     L->length=5;//本例中长度是5
17     cout<<"input list"<<endl;
18     for(int i=1;i<=L->length;i++)
19         cin>>L->r[i];
20     return L;
21 }
22 
23 //数组遍历输出
24 void PrintSqList(SqList *L)
25 {
26     for(int i=1;i<=L->length;i++)
27         cout<<L->r[i]<<" ";
28     cout<<endl;
29 }
30 
31 
32 //交换r[i]和r[j]
33 void swap(SqList *L,int i,int j)
34 {
35     int temp=L->r[i];
36     L->r[i]=L->r[j];
37     L->r[j]=temp;
38 }
39 
40 //冒泡排序优化
41 void BubbleSort(SqList *L)
42 {
43     int flag=1;//定义一个标志位,如果没有任何数据交换了,说明已经排好序,不用再循环
44     for(int i=1;(i<L->length)&&(flag==1);i++)
45     {
46         flag=0;//进行一次i循环之前,把flag置0,确保下一次循环是必要的
47         for(int j=L->length-1;j>=i;j--)
48         {
49             if(L->r[j]>L->r[j+1])
50             {
51                 swap(L,j,j+1);//交换顺序表中下标i和j的元素
52                 flag=1;//表示刚才有数据交换,所以实际上仍然有一次i的for循环是浪费的(看运行结果就知道了)
53             }
54         }
55         cout<<"after one sort"<<endl;
56         PrintSqList(L);
57     }
58 }
59 
60 int main()
61 {
62     SqList *p=NULL;
63     p=InitSqList(p);//初始化
64     BubbleSort(p);//排序
65     cout<<"after sort"<<endl;
66     PrintSqList(p);//输出
67 }

运行结果:

 

对于第三种冒泡排序优化版,时间复杂度的分析只对两种极端情况考虑:

1、排序表本身就是有序的。只需要两两比较一次确认是有序的即可。即n-1次比较,没有数据交换。时间复杂度是O(n)。

2、排序表正好是逆序的。

第1次从最后一个到第一个,进行n-1次比较,两两交换。第1个归位。

第2次从最后一个到第二个,进行n-2次比较,两两交换。第2个归位。

...

第n-2次从最后一个到n-2个,进行2次比较,两两交换。n-2个归位。

第n-1次从最后一个到n-1个,进行1次比较,两两交换。n-1个归位。

结束。

需要比较n-1+n-2+...+2+1=n(n-1)/2次,并做等数量级的交换。因此时间复杂度是O(n²)。

posted @ 2016-04-20 14:32  Pearl_zju  阅读(205)  评论(0编辑  收藏  举报