<C语言>你真的想明白冒泡排序了吗?


前言

        对于搜索大型数据库来说,对数据进行数据排序是至关重要的。用词典来查找字词是相对容易方便的,这是因为字典按字母表顺序排了序。排序(Sort)是一种非常有助于解决查找问题的技术,此外,如何有效地排序本事就是计算机算法的一个重要的研究领域。本文将介绍冒泡排序法


一、为什么名为冒泡排序?它的效率如何?

        之所以叫冒泡排序,是因为在进行从小到大排序时,小的数经过交换会想气泡一样慢慢的从低下“冒”上来。冒泡排序效率不高,实际需要的排序时间也很长,特别是在数据量很大的情况下更好费时间,这是因为它需要约 n ^ 2 / 2 次比较,然而对一些小数组来说,它的性能通常还是可以接受的。

二、实现算法的步骤

        将7,6,5,4,3,2,1,读入7个整数放置数组a中,如图

       在每一趟中,我们要两两比较元素大小,即第1个元素与第2个元素比较大小、第2个元素与第3个元素比较大小,逐步将大数值元素放置最后,总的比较次数应为总元素数减1,即7个元素两两比较6次,6个元素两两比较5次......,这样内外循环条件的控制就已经完成。

         总共7个元素,每一趟将一个大数值元素放置最后,共需要6趟,注意不是7趟,因为每次循环都把当前最大的元素放在数组的合适位置中,在n-1次循环后,算法就完成了所有元素的排序,即最后一个元素已经随着前6个元素的排序而被排好了。

       

int i = 0, j = 0, t = 0;
	for (i = 0; i < n - 1; i++)//外部循环
	{
		for (j = 0; j < n - 1 - i; j++)//内部循环
		{
			if (a[j] > a[j + 1])//比较相邻两个元素的大小
			{
				swap(&a[j], &a[j + 1]);//调用函数swap()实现交换a[j]与a[j+1]的值
			}
		}
	}

三.实现算法

1.输入n(n<=10)个整数,将它们从小到大排序后输出,使用冒泡排序法。

        代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#define MAXN 10
void swap(int* px, int* py)//传址调用
{
	int tmp = *px;
	*px = *py;
	*py = tmp;
}
void bubble(int* a, int n)//用指针a接收数组首元素地址,n为数组a中待排序元素的数量
{
	int i = 0, j = 0, t = 0;
	for (i = 0; i < n-1; i++)//外部循环
	{
		for (j = 0; j < n - 1 - i; j++)//内部循环
		{
			if (a[j] > a[j + 1])//比较相邻两个元素的大小
			{
				swap(&a[j], &a[j + 1]);//调用函数swap()实现交换a[j]与a[j+1]的值
			}
		}
	}
}
int main()
{
	int n, a[MAXN] = { 0 };
	int i = 0;
	printf("Enter n(n<=10): ");//提示输入n
	scanf("%d", &n);
	printf("Enter %d intergers: ",n);//提示输入n个数
	for (i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	bubble(a, n);
	printf("After sorted: ");
	for (i = 0; i < n; i++)
	{
		printf("%3d", a[i]);
	}
	return 0;
}

        定义swap()函数,进行传址调用,交换数值。

        定义bubble()函数,实现冒泡排序功能。

3.现展示第一趟中元素互换过程

         依此类推,若邻接元素不符合次序要求,则要对它们进行交换,直至循环结束,完成排序。

 

总结

        排序是程序算法中非常有挑战意义的。这里给出的冒泡排序以及c语言初学时选择排序法,从效率上讲都不是很高,实际需要的排序时间也很长,特别是在数据量大的情况下更是耗费时间。

        有兴趣的小伙伴可以考虑改进冒泡排序算法,以提高算法的效率,如有时候不需要 n - 1 次循环,数组元素就已经排好序,即若发现一遍循环后没有数据发生交换,说明已经排好了(提示:先假设后判断),下一篇文章,我将介绍分治法中优雅的快速排序。

 雄关漫道真如铁,而今迈步从头越。——毛泽东        

        新手上路,多有错误,还请小伙伴们多多指正,如果小伙伴们有优化改进,也可以发至评论区共同讨论,开拓视野,一同进步。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值