C语言-冒泡排序 (数据结构)

“冒泡排序法” 基本原理 

        从将要排序的对象中每次选择一个最小元素(或最大元素),按照非递减(从小到大)(或非递增(从大到小))顺序与相邻元素进行比较, 将小(或大)的元素交换至左端(或右端),所以小(或大)的元素会不断的往左(或右)移动,每次移动时,最大元素向“气泡”一样冒出,然后移动到适当的位置,因此称为冒泡排序法。以此类推,直至排序完成。

        冒泡排序法可以利用设置标志的方式减少比较时间,当走完一圈没有发生交换元素的动作,表示排序已经完成,而无需再进行之后的回圈比较与交换动作。

         如下所示:

        排序前:95 27 90 49 80 58 6 9 18 50

第1步:27 90 49 80 58 6 9 18 50 [95] 95浮出

第2步:27 49 80 58 6 9 18 50 [90 95] 90浮出

第3步:27 49 58 6 9 18 50 [80 90 95] 80浮出

第4步:27 49 6 9 18 50 [58 80 90 95] 58浮出

第5步:27 6 9 18 49 [50 58 80 90 95] 50浮出

第6步:6 9 18 27 [49 50 58 80 90 95] 49浮出

第7步:6 9 18 [27 49 50 58 80 90 95]  排序结束

到 第7步 时,剩下的数字6、9、18、27已经没有交换元素的动作,因此排序结束。

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10
#define SWAP(x,y) {int t; t = x; x = y; y = t;}//借助宏定义实现元素交换,可以修改为函数


void bubsort(int number[]){ 
	int i, j, k, flag = 1;
	for(i = 0; i < MAX-1 && flag == 1; i++){ 
		flag = 0; //判断结束标志
		for(j = 0; j < MAX-i-1; j++){ 
			if(number[j+1] < number[j]){
                //此处可以将SWAP宏定义中的交换修改为元素在内部交换
				SWAP(number[j+1], number[j]); 
				flag = 1;
			}
		}
		printf("第 %d 次排序:", i+1); 
		for(k = 0; k < MAX; k++){
			printf("%d ", number[k]);
		}
		printf("\n");
	}
}

int main(){
	int number[MAX] = {0}; 
	int i;
	srand(time(NULL));//刷新每次产生的随机数,若无此句,每次随机数相同,亲自尝试一下便知 
	printf("\n冒泡排序:\n\n");
	printf("排序前:");
	for(i = 0; i < MAX; i++){ 
		number[i] = rand() % 100; //产生0-99的随机数,这里没有采用固定的数组值进行排序,随机生成
		printf("%d ", number[i]);//输出数组元素
	}
	printf("\n\n");
	bubsort(number);
	return 0;
}

运行结果

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等日出看彩虹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值