一.导入
在我们写代码的时候,很多时候都会将数组作为参数传入函数,例如我们需要实现冒泡排序,我们假设有一个整型数组arr里面的内容是 9 8 7 6 5 4 3 2 1 0,我们需要用到冒泡排序算法将其变成 0 1 2 4 5 6 7 8 9
思路:我们写一个函数 bubble_sort(),将数组arr作为参数传入函数,在C语言中数组传参有两种写法:
第一种:直接传入数组
第二种:传入指针
相比起第二种方式传入指针,第一种写法更加容易理解,以下是代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[]){
//函数实现
}
int main(void)
{
int arr[] = {9,8,7,6,5,4,3,2,1,0};
bubble_sort(arr);
return 0;
}
上述代码中函数bubble_sort()的形参是一个整型数组,我们将main()函数中的arr数组传入该函数即可
接下来就是本程序的核心---冒泡排序
我们可以将冒泡排序理解为下图中的内容:
我们可以看到图中一趟冒泡排序是让一个数组来到它最终一个出现的位置上,我们也可以根据这一特点得出一下结论:
若有n个元素,则冒泡排序的趟数为:n-1 趟
那么我们可以写出以下代码:
我们首先使用sizeof()函数计算出数组元素的总个数,然后创建一个for循环当变量i的值小于sz-1的时候进入循环,执行一趟冒泡排序
我们假定第一个元素的下标为:j,则第二个下标则为:j+1,如图所示:
我们再来想一想,当我们一趟冒泡排序完成后,是不是我们冒泡排序的次数就可以减1,此时只需要对
8 7 6 5 4 3 2 1 0 来进行冒泡排序,这样每趟都减1,所以我们就可以将代码写成如下形式:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[]){
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz - 1; i++){
int j = 0;
for (j = 0; j < sz-1; j++){
if (arr[j] > arr[j + 1]){
//交换
}
}
}
}
int main(void){
int arr[] = {9,8,7,6,5,4,3,2,1,0};
bubble_sort(arr);
return 0;
}
接下来我们就需要实现交换功能,我们之前实现交换功能的时候都会创建一个tmp变量,这里也可以使用这种方法,代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[]){
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz - 1; i++){
int j = 0;
for (j = 0; j < sz-1; j++){
if (arr[j] > arr[j + 1]){
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j + 1] = tmp;
}
}
}
}
int main(void){
int arr[] = {9,8,7,6,5,4,3,2,1,0};
bubble_sort(arr);
return 0;
}
这样就实现了交换功能,最后一步就是在main()函数中进行输出
main()函数部分代码:
int main(void){
int arr[] = {9,8,7,6,5,4,3,2,1,0};
bubble_sort(arr);
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++){
printf("%d ",arr[i]);
}
getchar();
return 0;
}
但是当我们运行程序以后发现,程序并没有按照我们的设想进行排序
这时候我们就需要对程序进行调试,按下F10进入程序的调试,我们发现了几个问题:
问题1:我们明明传入的是一个数组,为什么在监视窗口只显示了一个元素
问题2:在bubble_sort()函数中sz的值理应是10,但是在程序运行时却变成了1
如图所示:
当sz的值为1的时候,在for循环中1-1=0,条件则变成了 i<0 进入循环不符合条件,for循环中的内容也不会被执行,我们之前说过数组传参的本质就是将数组首元素的地址传入函数,并不是将数组传入函数
所以这里arr看似是数组其实是指针,所以sizeof()计算应该是 4/4=1 (32位平台)那既然我们不能在函数中直接算出元素个数,那我们就在main()函数中将元素的个数计算出来,然后传入bubble_sort()函数中
最后代码可以写成如下形式:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[],int sz){
int i = 0;
for (i = 0; i < sz - 1; i++){
int j = 0;
for (j = 0; j < sz-1; j++){
if (arr[j] > arr[j + 1]){
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j + 1] = tmp;
}
}
}
}
int main(void){
int arr[] = {9,8,7,6,5,4,3,2,1,0};
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
int i = 0;
for (i = 0; i < sz; i++){
printf("%d ",arr[i]);
}
getchar();
return 0;
}
我们再次运行程序就可以发现,这次程序成功进行了排序,如图所示:
2023/8/30
王起舟