【C语言初阶】数组作函数参数(冒泡排序示例)
四、数组作函数参数
编写程序时,有时会将数组作为参数传递给函数。
比如实现一个冒泡排序的函数,将一个整型数组进行排序。
1 冒泡排序函数
1.1 冒泡排序函数的错误设计
代码示例:
#include<stdio.h>
void BubbleSort(int arr[])
{
int sz = sizeof(arr) / sizeof(arr[0]);//sz=1
int i = 0;
for (i = 0; i < sz - 1; i++)//排序躺数
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)//每趟比较对数
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main()
{
//冒泡排序
int arr[] = { 4,9,2,7,6,1,8,3,10,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
printf("排序前:>");
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);//排序前:>4 9 2 7 6 1 8 3 10 5
}
printf("\n");
//冒泡排序
BubbleSort(arr);//传递数组首元素的地址
printf("排序后:>");
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);//排序后:>4 9 2 7 6 1 8 3 10 5
}
printf("\n");
return 0;
}
解释说明:
1 运行此程序后,发现结果并非我们想要的是,打印的结果根本就没有排序。
经过调试发现,程序流进入 BubbleSort()
函数后,计算数组的长度时结果为1。
2 进入函数后,在计算数组长度时, sizeof(arr)
的结果为4,那么为什么呢?
BubbleSort(arr);
:传入的 arr
表示的是首元素的地址,那么就以指针形式接收。
void BubbleSort(int arr[])
:这里的 int arr[]
相当于 int* arr
;
在求数组长度 sz
时,sizeof(arr)
是在求一个指针变量的大小,那么结果自然就为4了。
1.2 冒泡排序函数的正确设计
代码示例:
#include<stdio.h>
void BubbleSort(int arr[], int len)
{
int i = 0;
for (i = 0; i < len - 1; i++)//排序躺数
{
int flag = 1;//设置标记
int j = 0;
for (j = 0; j < len - 1 - i; j++)//每趟比较对数
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = 0;//发生交换,标记置零
}
}
if (1 == flag)
break;//如果某躺排序比较后,发现没有进行交换就不再进行比较,结束排序
}
}
int main()
{
//冒泡排序
int arr[] = { 4,9,2,7,6,1,8,3,10,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
printf("排序前:>");
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);//排序前:>4 9 2 7 6 1 8 3 10 5
}
printf("\n");
//冒泡排序
BubbleSort(arr, sz);//同时传递数组首元素的地址和数组大小
printf("排序后:>");
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);//排序后:>1 2 3 4 5 6 7 8 9 10
}
printf("\n");
return 0;
}
解释说明:
1 BubbleSort(arr, sz);
:在传递参数时,将数组长度也作为实参一并传入。
2 在进行冒泡排序时,如果目标数组原本就是有序的,或者在某一次比较检查后没有发生交换,那么就退出比较的循环,结束冒泡排序。
此时,就可以设置 flag
,如果发生交换,flag
的值就发生改变,继续进行比较;
如果没发生交换,flag
的值就不会被改变,那么就提前结束冒泡排序。
即某躺比较后,如果发现没有元素发生交换,就证明此时数组已经是有序的了,那么就结束循环不再进行排序。
总结:
本节介绍了数组作函数参数;给出了冒泡排序函数的实现。
感谢您的阅读!如有任何错误,欢迎您的批评指正!