On 3月29日, 下午11时27分, 赵伟 <windzhao...@gmail.com> wrote:
> 2009/3/29 尚 <sniper...@163.com>
> 我猜你的程序应该是按照平均分数排序,但你的m替换的是一次输入的两个成绩。- 隐藏被引用文字 -
>
> - 显示引用的文字 -
这样是可以,但如果定义是int a[3][10],也就是说一个学生有9门课(最后一个为平均成绩),
那你的代码如何写?逐个交换可能就不现实了。最主要的一个是,效率会极其低下,因为每次如果发现需要交换,则类似
于"temp[0] = a[i][0]; // 交换"这样的语句就要执行30次,况且还只是3个学生。并且需要额外付出temp
[3][10]个空间的代价。
一个建议是不发生数据的实质性交换,只使用索引来排序,给出我的一个建议:
#include <stdio.h>
#define STU_NUM
3
int main()
{
int a[STU_NUM][3];
int i,j, max ,tmp;
int index[STU_NUM]; /* 存放最大平均成绩的下标 */
printf("请输入%d个学生的成绩...\n", STU_NUM);
for (i = 0; i < STU_NUM; i++) {
printf("输入第%d个学生成绩:", i + 1);
scanf("%d %d", &a[i][0], &a[i][1]);
a[i][2] = (a[i][0] + a[i][1]) / 2;
index[i] = i;
}
for (i = 0; i < STU_NUM; i++) {
max = i; /* 假设a[index[i]][2]最大 */
for (j = i + 1; j < STU_NUM; j++) /* 顺序比较其后是否有更大的 */
if (a[index[j]][2] > a[index[max]][2]) /* 如果有,则
记录其下标 */
max = j;
if (max != i) { /* 如果已经找到一个比当前a[index[i]][2]大的值,则交换其下标
*/
tmp = index[i];
index[i] = index[max];
index[max] = tmp;
}
}
for(i = 0; i < STU_NUM; i++)
printf("%-2d: %-4d %-4d %-4d\n", i + 1, a[index[i]]
[0], a[index[i]][1], a[index[i]][2]);
return 0;
}
On 3月31日, 下午1时23分, Niu Tao <niutao0...@gmail.com> wrote:
> }- 隐藏被引用文字 -
>
> - 显示引用的文字 -- 隐藏被引用文字 -
>
> - 显示引用的文字 -