冒泡排序(升序) (2)

一、算法

Ø冒泡排序是所有排序算法中最简单、最基本的一种。
Ø基本思想:通过相邻数据的交换来达到排序的目的。
Ø排序过程:
(1) 比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上;
(2) 对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置;
(3) 重复上述过程,共经过n-1趟冒泡排序后,排序结束

二、图解




三、代码

由图可知,冒泡排序需要进行 (n-1)趟,每一趟将一个数放到正确的位置上,下一次比较次数减一,第一趟需要进行(n-1)次比较,第二趟需要进行(n-2)趟,第 i 趟需要进行(n-i)次比较。我们用for循环实现代码,一共二层,外层循环控制趟数,内层循环控制比较次数。

#include<stdio.h>
#define N 10
int main()
{
	int i, j, a[N], temp;//temp用于交换数字
	for(i = 0; i < N; i++)
	{
		scanf("%d",&a[i]);
	} 
	for(i = 0; i < N - 1; i++)//外层循环控制趟数 N-1 
	{
		for(j = 0; j < N - i - 1; j++)//内层循环控制比较次数 N-i-1 
		{
			if(a[j] > a[j+1])
			{
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
			//如果前一个数大于后一个数,则交换 
		}
	}
	//输出排序好的数组
	for(i = 0; i < N; i++)
	{
		printf("%d ",a[i]);
	}
	return 0;
}

四、程序优化(不要求掌握,一般冒泡排序用上面的程序就足够了)

对于这样的序列 2 1 3 4 5,内循环进行一轮后,序列变成了 1 2 3 4 5,已经排好了,但对于这样一个已经排好的序列,仍需要进行(n-1)趟,我们可以在这里进行优化处理一下。

对冒泡排序的改进:

Ø当一次冒泡过程中发现没有交换操作时,表明序列已经排好序了,便终止冒泡操作。
Ø为了标记在比较过程中是否发生了数据交换,在程序中设立一个标志变量flag,在每趟比较前,把flag变量置为0,如果在这趟比较过程中发生了交换,把变量flag的值置为1。
Ø**在这一趟比较结束后判断如果flag变量取值等于0表示可以结束排序过程,否则进行下一趟比较。 **

#include<stdio.h>
#define N 10
int main()
{
	int i, j, a[N], temp, flag = 1;//temp用于交换数字 
	for(i = 0; i < N; i++)
	{
		scanf("%d",&a[i]);
	} 
	for(i = 0; flag && i < N - 1; i++)//外层循环控制趟数 N-1 
	{
		flag = 0;
		for(j = 0; j < N - i - 1; j++)//内层循环控制比较次数 N-i-1 
		{
			if(a[j] > a[j+1])
			{
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
				flag = 1;
				//如果发生了交换,flag赋为1,如果没有,flag仍为0,跳出循环 
			}
			//如果前一个数大于后一个数,则交换 
		}
	}
	for(i = 0; i < N; i++)
	{
		printf("%d ",a[i]);
	}
	return 0;
}

程序优化这种思想可以多加锻炼,虽然在这里可能没怎么优化,但是有了这种思想,我们写出的程序就会越来越高效

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

「已注销」

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

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

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

打赏作者

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

抵扣说明:

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

余额充值