各位CSDN的uu们你们好呀,今天小雅兰考试了呀,考的是计算机基础,希望不大......不过这些都不是问题,这不能阻止我对C语言的热情,那现在,就让我们进入冒泡排序的世界吧,我在写数组这篇博客的时候就说过,会把冒泡排序单独拎出来讲,今天总算是要兑现这个承诺啦
往往我们在写代码的时候,会将数组作为参数传个函数。
比如:我要实现一个冒泡排序(这里要讲算法思想)函数将一个整形数组排序。
这里首先给出一个乱序数组:
int arr[]={3,1,7,5,8,9,0,2,4,6};
排序的规律有两种:一种是“升序”,从小到大;另一种是“降序”,从大到小
冒泡排序是两两相邻的元素进行比较(这里我们来看升序)
这个就是小雅兰写的冒泡排序的过程啦,十个元素需要比较九次
那我们来写代码吧
我们首先肯定会这样来写
#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; i++)//冒泡排序的趟数 { int j = 0; for (j = 0; j < sz - i - 1; j++)//一趟冒泡排序的过程 { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } } int main() { int arr[] = { 3,1,7,5,8,9,0,2,4,6 }; bubble_sort(arr);//是否可以正常排序呢? int i = 0; for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { printf("%d ", arr[i]); } return 0; }
这可就奇了怪了,最后排序后的数组怎么是这样一个运行结果呢?这还是一个乱序数组啊,没有达到我们的预期。我们来看看究竟是怎么回事。
然后,我们就要引出我们的知识点啦
#include<stdio.h> int main() { int arr[10]={1,2,3,4,5}; printf("%p\n",arr); printf("%p\n",&arr[0]); printf("%d\n",*arr); return 0; }
我们可以发现:数组名的地址和数组首元素的地址打印出来竟然一模一样
由此我们得知:数组名是数组首元素的地址。
但是,并不是在任何情况下,数组名都是数组首元素的地址
int arr[10]={0}; printf("%d\n",sizeof(arr));
我们来运行一下,发现了不同
这个打印结果竟然是40诶
如果真是在任何情况下,数组名都是首元素的地址,那么,我们这串代码的打印结果应该是4才对啊
原来是有特殊情况的
补充:
1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。
除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。
所以,我们上面的那个冒泡排序函数些的是非常错误的。
当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。
所以即使在函数参数部分写成数组的形式: int arr[] 表示的依然是一个指针: int *arr 。
那么,函数内部的 sizeof(arr) 结果是4。
所以,正确的冒泡排序函数该怎么写呢?
#include<stdio.h> void bubble_sort(int arr[],int sz) { int i = 0; for (i = 0; i < sz; i++)//冒泡排序的趟数 { int j = 0; for (j = 0; j < sz - i - 1; j++)//一趟冒泡排序的过程 { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } } int main() { int arr[] = { 3,1,7,5,8,9,0,2,4,6 }; 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; }
这样子就非常完美啦
好啦,小雅兰今天的内容就到这里了,总算是把数组的收尾工作讲明白了,那么数组的所有知识点就告一段落了,接下来请期待小雅兰的操作符的博客噢,这段时间还是比较忙,明天上午考英语加油呀!!!(害,小雅兰的听力和口语真的好差,有点难过)