可以在找出余下的所有数中的最大值后再与第i+1个数交换位置,这样每一轮比较中最多只有一次两数交换操作,整个算法最多有n-1次两数交换操作。
#include <stdio.h>
#include <stdlib.h>
#define N 40
int ReadScore(int score[]);
void DataSort(int score[], int n);
void PrintScore(int score[], int n);
int main()
{
int score[N], n;
n = ReadScore(score); //调用函数ReadScore()输入成绩,返回学生人数
printf("Total students are %d\n", n);
DataSort(score, n); //调用函数进行成绩排序
printf("Sorted scores:");
PrintScore(score, n); //调用函数进行输出成绩排序结果
return 0;
}
//输入学生某门课的成绩,当输入为负值时结束输入
int ReadScore(int score[])
{
int i = -1; //i初始化为-1,可以保证循环体内i增1后数组下标从0开始
do{
i++;
printf("Input score:");
scanf("%d", &score[i]);
}while (score[i] >= 0);
return i;
}
//选择法将数组score的元素按值从高到低排序
void DataSort(int score[], int n)
{
int i, j, k, temp;
for (i = 0; i < n-1; i++) //因为数组最后一个即第n-1个不需要比较
{
k = i;
for (j = i+1; j < n; j++)
{
if (score[j] > score[k])
{
k = j; //记录最大数下标位置
}
}
if (k != i)
{
temp = score[k];
score[k] = score[i];
score[i] = temp;
}
}
}
//打印学生成绩
void PrintScore(int score[], int n)
{
int i;
for (i = 0; i < n; i++)
printf("%4d", score[i]);
printf("\n");
}
网友评论