一、接下来讲解一下c语言中比较简单的排序方法:冒泡排序
1.冒泡排序的核心思想:是两两相邻的元素进行比较
动画演示:
应用冒泡排序需要明确2点:
1.需要进行多少趟冒泡排序
2.每趟冒泡排序,需要比较的对数
二、代码实现及解析:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void bubble_sort(int* arr,int sz)
{
int i = 0;
//int sz = sizeof(arr) / sizeof(arr[0]);
//如果是10个元素进行排序,最多需要9趟。9个元素进行排序,最多需要8趟。
//由此可以推出控制条件为sz-1
for (i = 0; i < sz - 1; i++)//外层循环控制的是:趟数
{
int flag = 1;//假设我每一次排序之前,它的序列都是正确的。
int j = 0;//解释一下内层循环的控制条件:当每次排序成功之后,对应的数字就到达了它对应的位置,所以说需要比较的对数就逐渐减小,所以要-i
for (j = 0; j <sz-1-i ; j++)//内层循环控制的是:每趟需要比较的对数
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;//如果顺序不对,那么直接把flag赋值为0。
}
}
if (flag == 1)
break;
//刚开始的时候flag赋值为1,如果它没有进入内层循环的每一趟的对数的比较,就不会赋值为0
//所以说一趟下来就根本没有比较的话,就直接不用比较了,顺序就为正确的。
}
}
int main()
{
int i = 0;
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);//此方法用来计算数组内元素的个数
for (i = 0; i < sz; i++)//通过for循环在数字中存放输入的元素
{
scanf("%d", &arr[i]);
}
bubble_sort(arr,sz);
//数组传参的正确方法是:如果被调用的函数需要使用到元素的个数的时候,需要在主函数里面计算好之后传过去。
//因为这里数组传参的时候传的是首元素的地址,你再在被调用的函数里面,用原来的方法计算的时候,arr是一个指针,指针在32位平台下占4个字节的内存。
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
这里我设置了一个数组,能存放10个元素,然后对这10个元素进行冒泡排序。
这里的解析在代码的注释中。
值得注意的是:在数组传参的时候,如果需要传递数组中元素的个数需要在主函数中计算出来好之后,传到被调用的函数中。(sz)
因为如果你在被调用的函数里面,再按照原来的方法来计算数组中元素的个数的时候,那里面sizeof后面的arr数组只能是数组的首元素地址,是一个指针,指针在32位平台下的内存为4个字节,不可能计算的正确。
但是这个地方固定了只能让你排列10个元素的顺序,我们可以对代码进行优化
三、优化代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void bubble_sort(int* arr, int sz)
{
int i = 0;
//int sz = sizeof(arr) / sizeof(arr[0]);
//如果是10个元素进行排序,最多需要9趟。9个元素进行排序,最多需要8趟。
//由此可以推出控制条件为sz-1
for (i = 0; i < sz - 1; i++)//外层循环控制的是:趟数
{
int flag = 1;//假设我每一次排序之前,它的序列都是正确的。
int j = 0;//解释一下内层循环的控制条件:当每次排序成功之后,对应的数字就到达了它对应的位置,所以说需要比较的对数就逐渐减小,所以要-i
for (j = 0; j < sz - 1 - i; j++)//内层循环控制的是:每趟需要比较的对数
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;//如果顺序不对,那么直接把flag赋值为0。
}
}
if (flag == 1)
break;
//刚开始的时候flag赋值为1,如果它没有进入内层循环的每一趟的对数的比较,就不会赋值为0
//所以说一趟下来就根本没有比较的话,就直接不用比较了,顺序就为正确的。
}
}
int main()
{
int i = 0;
int n = 0;
scanf("%d", &n);
int arr[n] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);//此方法用来计算数组内元素的个数
for (i = 0; i < sz; i++)//通过for循环在数字中存放输入的元素
{
scanf("%d", &arr[i]);
}
bubble_sort(arr, sz);//数组传参的正确方法是:如果被调用的函数需要使用到元素的个数的时候,需要在主函数里面计算好之后传过去。
//因为这里数组传参的时候传的是首元素的地址,你再在被调用的函数里面,用原来的方法计算的时候,arr是一个指针,指针在32位平台下占4个字节的内存。
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
但是改变数组的大小,也就是变长数组,只有在c99下才会支持。
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!