C语言 谁能讲解一下选择排序法以及有效排序。
看不懂。还有如果有个题目是问在选择排序法里,如果在排序时a[i]>a[j](j>i)就叫做有效排序的话,那么怎么得出一组数的有效排序是多少,比如[4,1,3,2]里的有效...
看不懂。还有如果有个题目是问在选择排序法里,如果在排序时a[i]>a[j](j>i)就叫做有效排序的话,那么怎么得出一组数的有效排序是多少,比如[4,1,3,2]里的有效排序是多少?
希望高人指点,最好有个有效排序的C程序啦,谢谢。 展开
希望高人指点,最好有个有效排序的C程序啦,谢谢。 展开
2个回答
展开全部
用[4,1,3,2]作例子吧
(1)找出最小的元素-----(4,1),即用4和1比较,是有效排序,比较结果是1比较小,因此1再和3,2比较,(1,3),(1,2)这两次比较就不是有效比较了(1在3,2前面且比它们小)
因此第一轮排序为[1,4,3,2] 最小元素和第一个元素互换
(2)在剩余序列中继续找最小的元素(即排除了1)-----(4,3)比较,是有效排序。3比较小,因此3再和2比较,(3,2)是有效排序。找出最小的元素2。
第二轮排序为[1,2,3,4] 2和第二个元素4互换
(3)依次类推,(3,4)不是有效排序了。
因此,最后结果为[1,2,3,4] 有效排序为(4,1) (4,3) (3,2)
程序这东西要自己想,况且这个应该挺容易想出来的。。。。
(1)找出最小的元素-----(4,1),即用4和1比较,是有效排序,比较结果是1比较小,因此1再和3,2比较,(1,3),(1,2)这两次比较就不是有效比较了(1在3,2前面且比它们小)
因此第一轮排序为[1,4,3,2] 最小元素和第一个元素互换
(2)在剩余序列中继续找最小的元素(即排除了1)-----(4,3)比较,是有效排序。3比较小,因此3再和2比较,(3,2)是有效排序。找出最小的元素2。
第二轮排序为[1,2,3,4] 2和第二个元素4互换
(3)依次类推,(3,4)不是有效排序了。
因此,最后结果为[1,2,3,4] 有效排序为(4,1) (4,3) (3,2)
程序这东西要自己想,况且这个应该挺容易想出来的。。。。
展开全部
一般有两种选择排序法:(不明白有效排序具体要求是什么?)
一、冒泡法容易理解,但是效率低,主程序如下:
for (i=0;i<n;i++)
{
if (a[i]>a[i+1]) //
{
temp=a[i]; a[i]=a[i+1]; a[i+1]=temp;
}
}
以上程序的结果是将数组的最大值放在最后;
在这个程序的基础上再外循环n遍,就可以把数组从小到大全排序。
二、双循环 高效但是稍复杂:
main()
{
int i,j,p,q,s,a[10];
printf("\n input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++){
p=i;q=a[i];
for(j=i+1;j<10;j++)
if(q<a[j]) { p=j;q=a[j]; }
if(i!=p)
{s=a[i];
a[i]=a[p];
a[p]=s; }
printf("%d",a[i]);
}
}
本例程序中用了两个并列的for 循环语句,在第二个for 语句中又嵌套了一个循环语句。第一个for 语
句用于输入10 个元素的初值。第二个for 语句用于排序。本程序的排序采用逐个比较的方法进行。在i 次循环时,把第一个元素的下标i 赋于p,而把该下标变量值a[i]赋于q。然后进入小循环,从a[i+1]起到最后一个元素止逐个与a[i]作比较,有比a[i]大者则将其下标送p,元素值送q。一次循环结束后,p 即为最大元素的下标,q 则为该元素值。若此时i≠p,说明p,q 值均已不是进入小循环之前所赋之值,则交换a[i]和a[p]之值。 此时a[i]为已排序完毕的元素。输出该值之后转入下一次循环。对i+1 以后各个元素排序。
一、冒泡法容易理解,但是效率低,主程序如下:
for (i=0;i<n;i++)
{
if (a[i]>a[i+1]) //
{
temp=a[i]; a[i]=a[i+1]; a[i+1]=temp;
}
}
以上程序的结果是将数组的最大值放在最后;
在这个程序的基础上再外循环n遍,就可以把数组从小到大全排序。
二、双循环 高效但是稍复杂:
main()
{
int i,j,p,q,s,a[10];
printf("\n input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++){
p=i;q=a[i];
for(j=i+1;j<10;j++)
if(q<a[j]) { p=j;q=a[j]; }
if(i!=p)
{s=a[i];
a[i]=a[p];
a[p]=s; }
printf("%d",a[i]);
}
}
本例程序中用了两个并列的for 循环语句,在第二个for 语句中又嵌套了一个循环语句。第一个for 语
句用于输入10 个元素的初值。第二个for 语句用于排序。本程序的排序采用逐个比较的方法进行。在i 次循环时,把第一个元素的下标i 赋于p,而把该下标变量值a[i]赋于q。然后进入小循环,从a[i+1]起到最后一个元素止逐个与a[i]作比较,有比a[i]大者则将其下标送p,元素值送q。一次循环结束后,p 即为最大元素的下标,q 则为该元素值。若此时i≠p,说明p,q 值均已不是进入小循环之前所赋之值,则交换a[i]和a[p]之值。 此时a[i]为已排序完毕的元素。输出该值之后转入下一次循环。对i+1 以后各个元素排序。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询