冒泡排序的理解

冒泡排序是一种经典的交换排序方法,通过比较相邻元素并交换确保较小值向前移动。每趟排序将一个最大值移到末尾,直至完全排序。本文详细解释了冒泡排序的工作原理,并提供了C语言的实现示例,还讨论了如何通过添加标识符提高效率。

解读:冒泡排序是一种非常经典的排序方法,它属于交换类排序。之所以叫做“冒泡”,是因为这种排序方法类似于生活中汽水中的每一个小气泡逐渐向上冒,直到气泡都冒上去,水都沉下去。就是把待排序的一组数据中的每一个元素都当做一个小的气泡,若为升序排序,则较大的数向后移动,较小的数向前移动。

思想(以升序为例):若给定一组待排序的n个数据,它需要进行n-1趟(趟数为i),每一趟都会将一个最大值移到待排元素的最右端,而每一趟都要比较n-i次,依次比较两个相邻的元素,按照前小后大进行交换,这样就能保证这两个相邻元素小的在前面大的在后面。下面举一个列子:

                                                28         35         12         8         20

共5个数

第一趟排序:

1.首先从第一个元素开始,28和35进行比较,28<35不进行交换,此时排列顺序为:28 35 12 8 20;

2.再对35和12进行比较,35>12进行交换,此时排列顺序为:28 12 35 8 20;

3.再对35和8进行比较,35>8进行交换,此时排列顺序为:28 12 8 35 20;

4.在对35和20进行比较,35>20进行交换,此时排列顺序为:28 12 8 20 35;

此时一个小气泡35到达最终位置,第一趟排序完成后的顺序为:28 12 8 20 35;

第二趟排序:

1.首先从第一个元素开始,28和18进行比较,28>18进行交换,此时排列顺序为:12 28 8 20 35

2.再对28和8进行比较,28>8进行交换,此时排列顺序为12 8 28 20 35;

3.再对28和20 进行比较,28>20进行交换,此时排列顺序为 12 8 20 28 35;

此时第二个小气泡28到达最终位置,第二趟排序完成后的顺序为;12 8 20 28 35;

第三趟排序:

1.首先从第一个元素开始,12和8进行比较,12>8进行交换,此时排列顺序为:8 12 20 28 35

2.再对12和20进行比较,12<20不进行交换,此时排列顺序为8 12 20 28 35;

此时第三个小气泡20到达最终位置,第三趟排序完成后的顺序为:8 12 20 28 35

第四趟排序:

1.首先从第一个元素开始,8和12比较,8<12不进行交换,此时顺序为8 12 20 28 35

此时第四个小气泡12到达最终位置,第四趟排序完成后的顺序为:8 12 20 28 35

而剩下的8已经为最小,就不用比较.

至此,冒泡排序全部完成,排序后的顺序为:8 12 20 28 35。由于该排序算法每进行一趟,都要遍历一遍所有元素,所以时间复杂度为O(n^2)

用C语言完成冒泡排序算法:

void bubbleSort(int num[],int len){//len代表数组的长度
	int i,j,temp;
	for(i=0;i<len-1;i++){//需要进行len-1趟
		for(j=0;j<len-i-1;j++){//每一趟进行比较len-i-1
			if(a[j]>a[j+1]){
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
		}
	}
} 

还可以进行改进:

就是增加一个标识符flag,当某一趟排序,一次也没有进行比较,就说明此时的顺序已经有序,即不用再次进行比较,效率会更高。

代码如下:


void bubbleSort(int num[],int len){
	int i,j,temp;
    int flag = 1;//设置一个标识符flag
	for(i=0;i<len-1 && flag==1;i++){
        flag = 0;//在每一趟排序开始把flag赋值为0
		for(j=0;j<len-i-1;j++){
			if(a[j]>a[j+1]){
                flag = 1;//当进行比较则赋为1
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
		}
	}
} 

 以上就是我对冒泡排序的理解,欢迎大家批评指正!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值