哈喽,大家好,本人是一位编程小白,这是我的第一篇博客文章,关于冒泡排序的一些理解,写的不是很好,如果各位大佬看到,希望可以纠正,同时要有刚入门的小白们,咱们可以一块学习呀!
下面就进入正文啦
先抛出要解决的问题:
给定一个数组 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]);
}
}
到这里就结束啦,有什么不对的地方,请指教哈大佬们,感谢大家!