栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言冒泡排序算法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言冒泡排序算法

冒泡排序

冒泡排序是交换排序中最简单的排序方法,其基本思想是:两两比较相邻记录,如果反序则交换,直到没有反序的记录为止

void buble_sort(int arr[],int len)
{
	for (int k = 0; k < len - 1; k++)	//趟数,因为数组元素是10个,所以比较9趟
	{
		for (int i = 0; i < (len - 1)-k; i++)	//每趟过后交换的次数少一次
		{
			if (arr[i] > arr[i+1])
			{
				//交换
				int temp = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = temp;
			}
		}
	}
 }
 int main()
 {
     int arr[] = {9,8,7,6,5,4,3,2,1};
     int len = sizeof(arr)/sizeof(arr[0]);
     buble_sort(arr,len);
     for(int i = 0; i < len; i++)
     {
         printf("%d ",arr[i]);	//1 2 3 4 5 6 7 8 9
     }
 	return 0;
 }

冒泡排序优化

如果数组本身有序,使用冒泡算法的话,就要比较 len -1趟,显然当数组元素过多的时候效率是很低的,那有没有优化的可能呢,答案是有的。

优化方法:在第一趟比较的时候设置一个flag标志,初始值为1,如果发生元素交换时,flag就置0,说明数组不是本身有序,当一趟比较完后,再判断flag的值,如果仍然为1,则说明没有发生元素交换,数组本身有序,就退出循环,不用进行剩下的比较

void buble_sort(int arr[],int len)
{
	for (int k = 0; k < len - 1; k++)	//趟数,len -1趟
	{
		int flag = 1;		//设置flag标志,并初始化为1
		for (int i = 0; i < (len - 1) - k; i++)	//每趟过后交换的次数少一次
		{
			if (arr[i] > arr[i+1])
			{
				//交换
				int temp = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = temp;
				flag = 0;	//有元素进行了交换,falg置0
			}
		}		
		if (flag == 1)		//当进行一次比较后falg没有置0,说明没有交换,数组本身有序
		{
			break;			//退出循环,不用进行剩下的比较趟数
		}
	}
 }
 int main()
 {
     int arr[] = {9,8,7,6,5,4,3,2,1};
     int len = sizeof(arr)/sizeof(arr[0]);
     buble_sort(arr,len);
     for(int i = 0; i < len; i++)
     {
         printf("%d ",arr[i]);	//1
     }
 	return 0;
 }

冒泡排序的执行时间取决于排序的趟数,最好的情况下,待排序记录序列为正序,算法只执行一趟,进行了n-1次比较,不需要移动记录,时间复杂度为O(n);最坏的情况下,待排序记录序列为反序,时间复杂度为O(n2);平均情况下,冒泡排序的时间复杂度与最坏情况同数量级

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/784237.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号