文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言实现冒泡排序算法的示例详解

2024-04-02 19:55

关注

1. 问题描述

对N个整数(数据由键盘输入)进行升序排列。

2. 问题分析

对于N个数因其类型相同,我们可利用 数组 进行存储。

冒泡排序是在 两个相邻元素之间进行比较交换的过程将一个无序表变成有序表。

冒泡排序的思想:首先,从表头开始往后扫描数组,在扫描过程中逐对比较相邻两个元素的大小。

若相邻两个元素中,前面的元素大于后面的元素,则将它们互换,称之为消去了一个逆序。

在扫描过程中,不断地将两相邻元素中的大者往后移动,最后就将数组中的最大者换到了表的最后,这正是数组中最大元素应有的位置。

然后,在剩下的数组元素中(n-1个元素),重复上面的过程,将次小元素放到倒数第 2 个位置。

不断重复上述过程,直到剩下的数组元素为 0 为止,此时的数组就变为了有序。

假设数组元素的个数为 n nn,在最坏情况下需要的比较总次数为:((n−1)+(n−2)+...+2+1)=n(n−1)/2。

3. 算法设计

冒泡排序的过程我们用示意图简单的表示,从整个排序过程中寻找规律,n个元素只需比较n−1次即可。

假设一个数组中有 7 个元素,现在对这 7 个元素进行排序,只需比较 6 轮即可得到所要的有序序列。

示意图中最后加粗的数字即为经过一轮交换位置固定的数字。示意图如下:

动图演示

清楚了冒泡排序的过程,我们再来看一个动态图

4. 程序设计

设计一

数组名用 a 表示、数组下标用 j 表示,数组中相邻两个元素的下标可表示为 a[j]、a[j+1] 或 a[j-1]、a[j]。

在利用数组解决问题时需要注意数组下标不要越界。

假如定义一个整形数组 int a[n],则数组元素下标的取值范围是0~(n−1),下标小于0或者大于n−1 都视为下标越界。

如果相邻元素采用 a[j]、a[j+1] 表示的话,则下标取值范围是0~(n−2);

若采用 a[j-1]、a[j] 表示,下标取值范围则是1~(n−1)

设计二

数组元素互换 也是经常遇到的一类题型,一般这种情况我们需要 借助一个中间变量 才可以完成,对于许多初学者来说经常犯的一个错误是:对两个元素直接相互赋值,而不借助中间变量。

我们先来看生活中的一个例子:

在蓝墨水瓶中装有蓝墨水,红墨水瓶中装有红墨水;现在我们要把蓝墨水放到红墨水瓶中,红墨水放到蓝墨水瓶中。

做法是先找一个白色空瓶(作用相当于程序中的中间变量):

首先将蓝墨水倒入白色空瓶: t=a[i] 或 t=a[i+1];

接着将红墨水倒入蓝墨水瓶:a[i]=a[i+1] 或 a[i+1]=a[i];

最后将白瓶中的蓝墨水倒入红墨水瓶:a[i+1]=t 或 a[i]=t;

经过这 3 步就完成了红墨水与蓝墨水的互换。如果不借助白色空瓶,直接把蓝墨水倒入红墨水瓶,或把红墨水倒入蓝墨水瓶,这样必将破坏原来所存储的内容。

第一轮的交换过程可以用简单的程序段进行表示:

第二轮交换过程(最后一个元素经过第一轮比较已经确定,不需要再次进行比较):

第三轮交换过程(最后两个元素已经确定,不需要再次进行比较):

结论

由上面的程序段发现,第一轮比较的判定条件为 j < n-1;

第二轮为 j < n-2;

第三轮为 j < n-3;

依次类推,第 i 轮的循环判定条件必为 j < n-i。

在编程过程中我们可以用两层循环来控制,第一层循环控制交换的轮数,第二层循环控制每轮需要交换的次数。

5. 流程框架

6. 代码实现

假设有下面一组无序数组,我们要对它进行升序排序

完整代码

#include <stdio.h>

//冒泡排序函数
void BubbleSort(int arr[], int len)
{
	int i;
	int j;
	int temp;
	for (i = 0; i < len - 1; i++) //控制比较的轮数
	{
		for (j = 0; j < len - 1 - i; j++) //控制每轮比较的次数
		{
			if (arr[j] > arr[j + 1]) //数组相邻两个元素进行交换
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;

			}
		}

	}

}

//输出函数
void print(int arr[], int len)
{
	int i;
	for (i = 0; i < len; i++)
	{
		printf("%3d ", arr[i]);
	}
}

int main()
{

	int arr[10] = { 5,8,6,3,9,2,1,7,12,4 };

	BubbleSort(arr, 10);

	printf("The data after sorted:\n");
	print(arr, 10);

	printf("\n");

	return 0;
}

运行结果

代码贴图

7. 问题拓展

常用的排序方法除了上述的冒泡排序外,还有选择排序、插入排序、快速排序和堆排序等,下面简单介绍一下 选择排序。

选择排序思想:

扫描整个线性表,第一轮比较拿数组中的第一个元素与其他元素进行比较,遇到比第一个元素小的则进行交换;

再拿着交换之后的第一个元素接着上次比较的位置与后面的元素进行比较,直到扫描到线性表的最后,从中选出最小的元素,将它交换到表的最前面(这是它应有的位置)。

第二轮比较的时候从第二个元素开始,依次与第三个、第四个直到最后一个比较,在比较过程中有比第二个元素小的进行交换,接着与后面的元素比较;

对剩下的子表采用同样的方法,直到子表为空。在最坏情况下需要比较n(n−1)/2 次。

选择排序如下

#include <stdio.h>

//选择排序
void selectSort(int arr[], int len)
{
	int i;
	int j;
	for (i = 0; i < len - 1; i++)
	{
		int min = i;//假设第一个元素是最小的
		for (j = i + 1; j < len; j++)
		{
			if (arr[j] < arr[min])
			{
				min = j;//保存最小元素的下标
			}
		}
		//交换
		int temp = arr[min];
		arr[min] = arr[i];
		arr[i] = temp;
	}
}

//输出
void print(int arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%3d ", arr[i]);
	}
}

int main()
{
	int arr[10] = { 5,8,6,3,9,2,1,7,12,4 };

	selectSort(arr, 10);

	printf("The data after sorted:\n");
	print(arr, 10);

	printf("\n");

	return 0;
}

运行结果

代码贴图

不同排序法的效率是不同的,不同需求情况下可选择不同的方法。

到此这篇关于C语言实现冒泡排序算法的示例详解的文章就介绍到这了,更多相关C语言冒泡排序内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯