冒泡排序算法

哈喽,大家好,本人是一位编程小白,这是我的第一篇博客文章,关于冒泡排序的一些理解,写的不是很好,如果各位大佬看到,希望可以纠正,同时要有刚入门的小白们,咱们可以一块学习呀!

下面就进入正文啦

先抛出要解决的问题:

 给定一个数组 int arr[] = { 5,8,3,6,9,4,7,2,1,0 };

 要求对arr数组进行冒泡排序,排成升序 从小到大

 1.排序思想

这里为了方便大家理解,便采用了有序的数字,没有用上面乱序的,但思想是一样的,如果用以上乱序的,加一个if语句判断一下就好啦,if语句下文代码中已经加好啦

这个是数组原次序:9,8,7,6,5,4,3,2,1,0
 第一躺:
    8,9,7,6,5,4,3,2,1,0
    8,7,9,6,5,4,3,2,1,0
    8,7,6,9,5,4,3,2,1,0
    8,7,6,5,9,4,3,2,1,0
    8,7,6,5,4,9,3,2,1,0
    8,7,6,5,4,3,9,2,1,0
    8,7,6,5,4,3,2,9,1,0
    8,7,6,5,4,3,2,1,9,0
    8,7,6,5,4,3,2,1,0,9 //经过第一趟的循环比对,数组的次序变成了这样
    同时可以发现,在循环第一趟时,我们的9与其他数字比对了9次
第二躺:
    8,7,6,5,4,3,2,1,0,9 //循环第二躺,在此基础上继续循环比对
    7,8,6,5,4,3,2,1,0,9
    7,6,8,5,4,3,2,1,0,9
    7,6,5,8,4,3,2,1,0,9
    7,6,5,4,8,3,2,1,0,9
    7,6,5,4,3,8,2,1,0,9
    7,6,5,4,3,2,8,1,0,9
    7,6,5,4,3,2,1,8,0,9
    7,6,5,4,3,2,1,0,8,9 //最终数组得到了这个次序
    同时可以发现,在循环第二趟时,我们的8与其他数字比对了8次,忽略了与9比对
    这里就验证了下文两句话
    “1.外循环每循环一次,那么我们内循环的比对就会少一次 
     2.(因为最后一位数,我们已经得到想要的结果啦,所以在下一趟比对时,不用和它比了,因此少一次)”
后面还会有,第三趟:
           第四躺:
           .....
           直至外循环结束跳出
且比对思想与以上一样

2.代码实现

 这里是自定义排序函数负责实现逻辑

//排序函数
void bubble_sort(int* arr , int arr_size)
{
	int tmp = 0;
	//外循环代表我们要循环多少趟
	//详细点说就是:当外循环i=1时,那么我们就进入内循环开始循环第一躺
	//             当外循环i=2时,进入内循环开始循环第二躺
	//			   ....
	//			   循环直至不满足条件跳出    注:外循环循环次数由元素个数决定,例如有n个元素,那么就循环n-1次
	for (int i = 1; i < arr_size; i++)
	{
		//内循环代表我们每一趟要循环比对多少次
		//外循环每循环一次,那么我们内循环的比对就会少一次 
		// (因为最后一位数,我们已经得到想要的结果啦,所以在下一趟比对时,不用和它比了,因此少一次)
		for (int j = 0; j < arr_size-i; j++)
		{
			if (arr[j]>arr[j+1])//这里面就是大致逻辑啦,大家可以对着理解一下,我词穷啦!!!
			{
				tmp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = tmp;
			}
		}
	}
	
}

主函数调用

//冒泡排序
int main()
{
	//对arr进行排序,排成升序 从小到大
	int arr[] = { 5,8,3,6,9,4,7,2,1,0 };
	int arr_size = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(&arr,arr_size);//用数组传参,实际传的是数组中第一个元素的地址
	for (int i = 0; i < arr_size; i++)
	{
		printf("arr[%d]=%d\n", i, arr[i]);
	}
}

到这里就结束啦,有什么不对的地方,请指教哈大佬们,感谢大家!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值