冒泡排序可以让一个无序数组变成有序数组的一种算法思想,也是最简单的一种排序思想,但是在我们初学C语言时,会遇到一些大大小小的问题,那接下来就请跟着我的思想来一起理解冒泡排序:
本篇文章将把冒泡排序封装成一个独立的函数来进行讲解:
我们定义一个函数应该知道这个函数要接收几个值,所接收值应该是什么类型,所返回类型是什么?因为我们冒泡排序函数只是排序用,所以返回值用void,在来到接收值,我们引用函数是给函数递过来两个值,一个数组一个元素个数,所以我们这里也要放两个形参来接受,第一个是数组,与数组类型一致,第二个元素个数,这里可能会有人有疑问,为什么不能在函数内部把元素个数算出来,毕竟我们已经把数组传过来了,这里是一个很容易错的地方,数组在传参时,只会把数组首元素的地址传过去,所以函数里面的数组实际上只有一个元素,这样要是在到函数里面算元素个数就会和实际元素个数不一样,导致我们这个函数实现不了预期的作用,现在我们就把函数的接收和返回类型订好了那冒泡排序具体是怎么将无序数组变成有序数组呢?其实不是很复杂,我们上面定义了一个变量,是用来计算要跑的趟数的,那这个趟数是多少呢?我们要知道冒泡排序实际是什么才能得到答案,冒泡排序实际上是从第一个数开始和每个数比大小然后根据是要排升序还是降序来决定要不要换位置,那既然是换位置,只剩一个元素的时候是不是就没有这个换位置的必要了,那是不是我们只用元素个数减一趟就可以将这个数组排序完成了,那我们这么实现跑这么多趟呢?这里用循环语句,如果当我们跑的趟数少于这些应该跑的趟数时,进入循环,然后跑完这趟后加一,继续进行下一个循环:
那进入循环之后我们要这么让这个元素一趟一趟和他右或左元素对比呢?是不是就需要嵌套另一个循环语句来实现,那这个时候,我们每个元素要比多少次大小才合适呢?每次跑完一趟都会有一个元素确定位置,这个时候我们是不是就没必要和他比了,那我们每个元素是不是只需要比趟数减去跑的第几趟就行:
那接下来都是不是就到了我们比大小环节,那比了大小,我们怎么去换这个元素的位置呢?这个时候就需要一个变量(姑且叫他tihuan),我们把原来的元素(姑且叫1)放到tihuan里面去,那1现在里面就空了,在把2里面的元素放1的里面,在把放在tihuan里面的元素放到2的位置,那这个换位置就好了:
那到现在整个函数就写完了,我们让代码跑起来运行一下:
看,我们是不是成功了。
那以上就是我对于冒泡查找整个算法的逻辑上的一个见解,希望对大家有所帮助。
源码:
#include<stdio.h>
void maopao_paixu(int arr[], int sz)
{
int j = 0;
int i= 0;
for (j = 0; j < sz - 1; j++)
{
for (i = 0; i < sz - 1 - j; i++)
{
if (arr[i] > arr[i + 1])
{
int tihuan = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tihuan;
}
}
}
}
int main()
{
int arr[] = { 90,38,34,27,162,487,293 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
maopao_paixu(arr, sz);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}