c/c++数据的排序方法(函数+数组《选择排序法》)
【例】数组的排序问题——输入n个学生的成绩,按成绩由高到低的方式输出。
分析:
输入n个学生成绩——可以调array_in( )函数
按从大到小顺序排列成绩——调sort( )函数
输出排序后的成绩——可以调array_out( )函数
这里我们主要来讨论排序的函数
1.选择法排序
进行多轮选择,第一轮选一个最大数(将a[0]与a[1]~a[n-1]进行比较,后者大则交换),第二轮选第二个最大数(将a[0]与a[1]~a[n-1]进行比较,后者大则交换)第n-1轮选第n-1个最大数(第n-1次选第n-1大数:将a[n-2]与a[n-1]进行比较,后者大则交换。)
由此可知
用循环i表示选大数的次数,即:i=0;i<n;i++
用循环j表示比较的次数,即:j=i+1;j<n;j++
比较x[i]<x[j] —— 当为真则两者交换。
函数如下:
void sort(float x[],int n) {
int i,j;float t;
for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
if (x[i]<x[j]){
t=x[i];
x[i]=x[j];
x[j]=t;
}
}
选择法的改进
此种方法每一次比较会将较大值放在前面一个,非常的繁琐。那么我们为何不定义一个可变的最大值呢?每比较一次就将最大值放入一轮下来最大的就给这个变量赋值成了最大。最小同理。
函数如下
void sort(float x[],int n){
int i,j,k;float t,m;
for (i=0;i<n-1;i++){
k=i;m=x[i];
for (j=i+1;j<n;j++)
if (m<x[j]){
m=x[j];k=j;
}
if (i!=k)//如果最大值为其本身
{
t=x[i];x[i]=x[k];x[k]=t;
}
}
}
谢谢大家!