C语言高手请回答我几个问题,关于数组排序问题
发布网友
发布时间:2022-04-29 14:55
我来回答
共4个回答
热心网友
时间:2023-10-13 05:24
第一个问题,数组名本身是一个地址,即指针值,该地址为数组第一个元素的地址,该指针的第i个偏移就是第i+1个元素的地址,如a=&a[0]; (a+1)=&a[1]
所以准确来说,应该是把数组的首地址,和需要操作的元素个数,作为实参传入函数
第二个问题,
for(i=0;i<n-1;i++){//n个元素,排n-1轮
//1 选择:从乱序a[i]-a[n-1]中
// 选择最大值元素
max_id=i;
for(j=i+1;j<n;j++){
if(a[max_id]<a[j])
max_id=j;
}
//2 交换:乱序a[i]-a[n-1]中
//最大值元素与乱序中首个元素交换
tmp=a[i];
a[i]=a[max_id];
a[max_id]=tmp;
}
这是选择排序法,
刚进入循环,max_id为第一个元素下标,j 为与下标为max_id的元素比较大小,的元素的下标
所以此时j=i+1表示第二个元素,那第二个元素与第一个元素比较
max_id为较大值的下标
然后j++,拿第三个元素与第一个元素比较
依次至最后一个元素,选出最大的元素值,然后与第一个元素值交换
比如int a[5]={1,4,2,3,5}
a[0]比a[1]小,则max_id=1, 然后阿 a[1]比a[2]大 还是max_id=1,最后a[4]最大,max_id=4
for(j=i+1;j<n;j++)执行完毕,执行交换部分的语句
交换a[0]和a[4],此时顺序为5.4.2.3.1
然后继续for(i=0;i<n-1;i++)循环,i=1,max_id为第二个元素下标,从a[1]开始,拿a[2]与a[1]比
总之是先找出最大的,放在第一位,再找第二大的,放在第二位,依次可得从大到小的排序
最后,建议主函数写成
int main(){
sortTest();
return 0;
}
因为需要返回值给系统表明调用主函数结束
热心网友
时间:2023-10-13 05:25
前者正确。
后者:d_sort()函数是选择排序,每次从未排序序列中选择一个最大(最小)的值加入到已排序序列中。由于是原地排序,a数组中0~i-1是已排序序列,要从剩下部分(即i~n-1)选择一个最值,加入到已排序序列中(事实上的实现是将这个最值加到i的位置。之后已排序序列是0~i,最后最外层循环i++使下次操作时的已排序序列为0~i-1)。而for(j=i+1;j<n;j++)从i+1开始,是因为之前已将i位提出(max_id=i),之后从i~n-1中找最值,只需从i+1开始一一与a[i]比较。一旦a[j]比a[i]更优,则交换两者,此时a[i]已为新值(即i~j中的最优值),不断重复,从而使a[i]为i~n-1中最优值。
i不断增1,则每个a[i]都是剩余序列中的最优,则最终结果就是一个排好序的序列。
热心网友
时间:2023-10-13 05:25
sortText里面的d_sort(s,10),表示调用函数,只把元素的值传过去,名称传不过去。
for(j=i+1;j<n;j++),比较元素时从下一个开始比较,自身就不用比较了,就是冒泡排序,不知道你懂不?
热心网友
时间:2023-10-13 05:26
写错了吧