C语言,用选择法对数组中10个整数按由小到大排序

#include<stdio.h>int main(){ void sort(int arry[],int n); int a[10],i; printf("enter array:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); sort(a,10); printf("the sorted array:\n"); for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); return 0;}void sort (int array[],int n){ int i,j,k,t,; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(array[j]<array[k]) k=j; t=array[k];array[k]=array[i];array[i]=t; }}
补充一下改之前和改之后的运行结果

太奇葩了吧?再把k=i改成d=i,把if(array[j]<array[k])改成if(array[j]<array[d])看看行不行?前面用k作比较下标变量信息记录,突然冒出个与前面比较没有任何关系的d来肯定造成错误操作……追问

很头疼!!!!

k 是 j 赋的值 d 也是 j 赋的值 那么k和d的值是一样的吧, 所以 array[k] 和 array[d] 的值也是一样了吧????

追答

头疼是你自找苦恼!我说了那么多简直是白说。array[k] 和 array[d]怎么会一样?array[k]参与了与array[j]的比较,然后由比较结果确定是否把j赋给k,那么k下标元素值就是已经比较过的所有j下标元素中的最小值;而if(array[j]<array[k]) d=j;这样写,由于k=i未变,所以d下标就只是小于array[i],却不能保证是从第i+1元素到最后中的“最小”。说穿了,if(array[j]<array[k]) d=j;这样写,由于i是从0开始的,所以array[k]就一直是array[0],因此d就是从第1个元素起最后一个小于array[0]的元素的下标,而不一趟j循环中最小值的下标,逻辑上就彻底错了……

追问

追答

睁着眼睛说瞎话!array[[k]怎么就和array[d]一样了?array[d]与array[j]作比较了吗?没有比较d和j能建立起什么关系,你就把j理直气壮地赋给d了,有什么道理?我都前面讲那么多了,你不能细看一下吗?你那样写在j的一趟比较中array[k]不变,一直是array[i]的值,所以array[d]不一趟中“最小”的,而"最后一个"比array[i]小的……

追问

追答

你怎么这么奇葩?只有两个数,比较一次不就把全部数比较完了吗?根本只有值的大小,不涉及位置信息,你赋给谁不行?判断两个数的大小与判断几十个或几百个数的最小者算法一样吗?两个数的小者就是最小的,10个数若判断出第2个比第1个小你能保证第2个是第1个后面的9个中最小的吗?你根本就没有弄清“选择排序”的思想:它是找出“后面”没有排序的数中的“最小的”放在前面已经排好的最后一个数的后面……

追问

追答

你倒底想问什么问题?你d=k=i;而不把if(array[j]<array[k])改成if(array[j]<array[d]),后面又用d=j;而不是k=j;那你就得不到正确结果——写k=i;if(array[j]<array[k]) d=j;...的效果和写d=k=i;if(array[j]<array[k]) d=j;...的效果是一样的,d没有参与比较,没有承载数据大小的位置信息!哪个变量作为下标参与比较,就得用哪个变量记录最小(或最大)值的下标才对。你把改前、改后的代码帖上来我来看……

追问

感谢感谢感谢..................................................................

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答