您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
025第六章 数组03 冒泡算法最好理解的一种思路、数组元素个数获取的坑
发布时间:2021-04-19 18:23:40编辑:雪饮阅读()
首先这里介绍下,如何打开vc6++的调试悬浮窗。
对于vc6++一般为了方便调试,则调试框(调试工具的元素集,像是按钮之类的)一般悬浮到界面上比较方便。
那么这个调试框,一般是没有显示的。至少我接触的vc++6目前没有看到默认就显示有的。
可以在右侧如这种空白区域鼠标右键
然后勾选这个调试项目,然后就可以看到调试框就显示出来了
那么对于其它的一些ui部件,同样也可采取此方法。
冒泡排序算法
对于一个数列如:985420,要求从小到大排列。那么使用冒泡算法具体实现大概流程如下图:
就如图这样,一直交换到第n趟,结果就会出来了。
这里是以从小到大排列进行演示,就是说每次从上面向下面逐个进行交换,一直把最大的一个数沉到底之后,就是下一趟再来进行从上到下进行逐个交换了。
那么具体的实现代码如:
#include <stdio.h>
void main()
{
int a[]={9,8,5,4,2,0};
int temp;
//c语言中获取数组长度,有点麻烦,这里既然已经知道数组长度了,那么就先写死,为了方便起见
int length=6;
/*
假定i从0(下标)开始,则最大下标是length-1,但是实际上length-1不用计算,因为这里打算从小向大排序,按照这里的实现逻辑,最小的数在最顶上,当
还剩下最后一个数即(n-1)的时候其实这个时候它是找不到下一个数要进行比较了,因为此时它沉到最低,已经是最大的了
*/
for(int i=0;i<length-1;i++){
/*
内存循环每次两个相邻之间进行比较,小的放上面,大的放下面,每交换一次,游标就向下滑动一个单位,则剩下用于交换的数的个数就是-i
同样的,这个内部循环里面每次剩下的用于交换的数的个数(-i)里面,当进行交换到-i的最后一个数的时候也不需要进行交换了,因为在-i这波数据里面
最后这个数,也就自然的是-i这波数据中最大的一个了
*/
for(int x=0;x<length-i-1;x++){
if(a[x]>a[x+1]){
temp=a[x];
a[x]=a[x+1];
a[x+1]=temp;
}
}
}
//打印排序结果
for (int y = 0; y < length; y++)
{
printf("%d\n",a[y]);
}
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
0
2
4
5
8
9
数组长度(元素个数)计算的坑
上面呢提到了数组长度获取比较麻烦,那么具体麻烦在哪里呢?
其实麻烦在于兼容性,就是说,如果不将数组长度获取封装为一个独立的函数,那么数组长度获取还算简单。但是由于数组的特殊性,如果要把数组传递给另外一个函数,那么这个函数接收数组的形参必须如int *a这种形式(即指针,而csdn上有一网友竟然直接int a[]这种形式接收,我猜想他那个应该是cpp即c++,不过我没有学过c++,反正c中这样写,编译都通过不了,至少我当前环境就是编译都通过不了),但是这种形式它接收的是一个指针,虽然数组本身就是指针,也就是说给这个函数传递数组时候不用加&符号,但是这个函数接收到以后就是指针,如果直接对其进行sizeof求的就是指针的大小了,而不是数组的大小了。
那么数组长度,一般计算肯定是通过sizeof获取整个数组大小,然后获取整个数组任何一个元素的大小,用前者除以后者即可。因为数组的类型是统一的,那么数组大小就是数组总占字节数除以元素对应的数据类型的大小。就是数组元素个数了、
那么可以看看如下程序就是这样的一个坑:
#include <stdio.h>
double getLength(int *g_a){
double length;
/*
这样是错误的,得到的结果永远是1
因为,m_a是函数参数,到了本函数中,m_a变成了g_a只是一个指针(地址,系统在本函数运行时,是不知道g_a所表示的地址有多大的数据存储空间,这里只是告诉函数:一个数据存储空间首地址),
所以,sizoef(g_a)的结果是指针变量m_a占内存的大小,
指针即为地址,指针几个字节跟语言无关,而是跟系统的寻址能力有关。譬如以前是16为地址,指针即为2个字节,32位系统是4个字节,如果64位,则就为8个字节
那么我这里正好是64位,所以sizoef(g_a)为8
m_a[0]是int类型,sizeof(m_a[0])也是4个字节,所以,这里结果就是2了
显然结果是错误的
*/
int cz=sizeof(g_a);
int cy=sizeof(g_a[0]);
printf("cz=%d,cy=%d\n",cz,cy);
length=cz/cy;
return length;
}
void main()
{
int m_a[] = {1,2,3,4};
int length;
//数组占内存总空间,除以单个元素占内存空间大小(按数据类型计算,并不是按实体常量值计算)
length=sizeof(m_a)/sizeof(m_a[0]);
//输出length of a=4
printf("length of m_a=%d\n", length );
printf("getLength=>length of m_a=%lf\n", getLength(m_a));
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
length of m_a=4
cz=8,cy=4
getLength=>length of m_a=2.000000
关键字词:c,数组,元素个数,冒泡算法
上一篇:024第六章 数组02