首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

插入排序的一个有关问题(排序函数为什么要有两个参数?)

2013-06-26 
插入排序的一个问题(排序函数为什么要有两个参数?)我的问题貌似很简单,但一直搞不清楚。下面两个插入排序的

插入排序的一个问题(排序函数为什么要有两个参数?)
   我的问题貌似很简单,但一直搞不清楚。下面两个插入排序的C程序,几乎相同。不同的地方就是insertsort函数的参数个数不同。第一个程序排序函数有两个参数,能输出正确结果。第二个程序只少了一个整形参数,但为什么第二个程序就不能输出正确的结果呢?
   我怎么也想不明白,求大神解答。

/*程序1:该程序insertsort函数有两个参数*/
#include <stdio.h>
#define len(a) (sizeof(a)/sizeof(int))

void insertsort(int a[], int);

int main()
{
int i;
int a[10] = { 10, 34, 32, 95, 84, 90, 25, 65, 31, 69};
insertsort(a, len(a));
for (i = 0; i < len(a); i++)
printf("Num[%d] = %d.\n", i+1, a[i]); 
printf("len(a) = %d\n", len(a));
return 0;
}

void insertsort(int a[], int lim)
{
int i, j, key;
for (j = 1; j < lim; j++) {
key = a[j];
i = j - 1;
while (i >= 0 && a[i] >= key) {
a[i+1] = a[i];
i = i - 1;
}
a[i+1] = key;
}
return;
}


/*程序2:该程序insertsort函数只有一个参数*/
#include <stdio.h>
#define len(a) (sizeof(a)/sizeof(int))
void insertsort(int a[]);/*此处只有一个参数*/

int main()
{
int i;
int a[10] = { 10, 34, 32, 95, 84, 90, 25, 65, 31, 69};
insertsort(a);
for (i = 0; i < len(a); i++)
printf("Num[%d] = %d.\n", i+1, a[i]); 
printf("len(a) = %d\n", len(a));
return 0;
}

void insertsort(int a[])
{
int i, j, key;
int s = len(a);
for (j = 1; j < s; j++) {
key = a[j];
i = j - 1;
while (i >= 0 && a[i] >= key) {
a[i+1] = a[i];
i = i - 1;
}
a[i+1] = key;
}
return;
}

[解决办法]
从测试结果其实你能看出来的,第二个程序数组长度上是不对的,就是这句:
int s = len(a);
这里的s用debug可以得出是1而不是所谓的10,这是因为你传递给子函数的形参是整型指针,分配内存时只是分配了一个整型的长度来存储地址,这里是地址,而不是你原来的数组数据,这点需要理解清楚,也就是说你子函数的形参a只是记录了数组第一个数据的地址,不再是原来主函数中的数组!只是同名而已,我觉得你还是指针没明白,再看看指针吧。
[解决办法]
第2个程序中的"int s = len(a);"的a是当作指针变量来计算的,而非数组
[解决办法]
对于数组的操作,要么需要显式传入数组长度
要么就用c++的vector等有长度计算方法的容器类来实现
[解决办法]
是形参...
[解决办法]
c 中,如果只传入子程序一个array, 在子程序中是无法求处 array 的长度的

热点排行