🍓🍓🍓目录
⭐ 对于新手小白们对数组进行定向排序不免是一个比较复杂的问题,但是不要着急,今天我们就来认识一下快速排序的方式之一——冒泡排序的方法。
⭐授人以鱼不如授人以渔,我们先来看看解决那些我们没有见过的问题。首先对于一个新问题我们首先要做到对其具有一定的思考,比如说我们对一个无序数组的排序。有没有那种一下子就可以解决的排序方法呢?当然是有的那个叫做qsort快速排序,但是需要对指针十分了解才可以很好的使用这个函数,有兴趣的小伙伴们可以点击本人头像前往主页进行查找关于qsort函数的超详细解析以及函数实现哦。
🍍1)冒泡排序思想
⭐但是qsort并不是我们本次博客的目标,那么用仅存的数组知识对数组数据进行直接排序肯定是不太现实的,那么我们肯定会想不能一下子换那就一个一个交换。没错我们的冒泡排序就是依次一个一个数字进行比较并且交换的。如下面的数据:
⭐步骤一
首先我们先拿出第一个数字12来依次和数组中的所有数字进行比较如果第一个数字大的话就交换我们数字的顺序,之后将交换之后的第一个数字继续和下一个数字进行比较。
⭐步骤二:
那么经过一趟先来我们的最小的数字是不是就到达了我们的第一位呢?之后第一趟交换结束进行我们的第二趟排序,从我们第二个数据开始进行交换,(但是我们第二个数据原本就在应该处于的位置,那么我们进行下一组数据的检查操作)。
⭐步骤三:
经过一组交换我们的24也已经处于了 我们应处的位置,之后就是我们的下一趟排序,56>42交换,之后我们的数组排序也就已经完成了。
是不是很简单? 那么接下来我们来具体分析一下冒泡排序所需要排序的次数。
🍍2)冒泡排序具体细节程序化
⭐接下来我们就来分步骤解析冒泡排序的细节。就像我们上面说的那样我们通过多趟排序使得我们的数据一个一个回到应该处于的位置当中。这个操作我们可以利用循环进行实现,之后的数字后移的操作步骤可以通过循环嵌套的步骤进行实现。值得我们注意的是,我们的循环嵌套操作的次数。
⭐首先我们来分析外部循环的界限,我们需要从第一个数进行比较,一直比较到最后一个数字,起始是第一个数据的下标也就是0,我们循环的截止条件应该是数组最后一个数据的下标。内部循环的起始条件是外部循环+1,而截止条件就不同了,由于我们由于我们之前的数据不需要重复比较且要比较的数字逐渐减少,一旦超过访问大小超过数组的大小就会造成数组越界,所以我们应该思考变量之间的关系,也就是内部循环的截止条件与外部循环变化量之间的关系,不难发现,它们之间的关系为外部循环的截止条件等于数组总数据的个数减去外部循环当前的只减去1。那么找到这样的关系之后我们就可以将我们的程序完整的书写出来了。
🍍3)冒泡排序实操及代码呈现
⭐按照我们的思路来构建代码也就是以下情况:
我们可以看到即使数字重复也可以进行排序。快去试试吧!
#include<stdio.h>
//冒泡排序
void bubble_sort(int*arr1,int sz)
{
int i = 0; //外部循环变量
int j = 0; //内部循环变量
int ret = 0; //交换需要的中间变量
for (i = 0; i < sz; i++)
{
for (j = 0; j < sz - i - 1; j++)
{
if(arr1[i]>arr1[i+j+1])
{
ret=arr1[i];
arr1[i]=arr1[i+j+1];
arr1[j+i+1]=ret;
}
}
}
return;
}
int main()
{
int arr[10] = { 34,23,56,787,35,987,121,23,45,2 };
int sz = sizeof(arr) / sizeof(arr[0]);
//调用自定义函数进行排序
bubble_sort(arr,sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}