算法程序问题描述:
目的是根据给定的数组,当你键入一个数字N时,程序会打印出数组的前N名元素(此算法可以应用于对学生成绩的操作),算法主要解决两个方面的问题,一个是首先要对数组各元素进行排序,才可以输出想得到的前N个元素;另一个则是要考虑有相同数值的情况(比如一个班中学生的成绩很可能有相同的).即相同值要么不符合要求一个也不打印,要么符合要求全部打印出来.(即最后打印出来的数值个数应该>=N).
此算法中的待排序数组可以是用户自己键入的数组,也可以是源代码中已含的数组.
算法源程序:
#include <stdio.h>
#define SIZE 8
void sort(double tempArray[], int sortResult[], int n)
{
int i = 0, j = 0;
int index = 0, k = 0;
for (i = 0; i < n; i++)/* 对映射数组赋初值0 */
{
sortResult[i] = 0;
}
for (i = 0; i < n; i++)
{
double temp = -32767;
index = i;
/* 找到最大的元素并保存此时的下标 */
for (j = 0; j < n; j++)
{
if ((temp < tempArray[j]) && (sortResult[j] == 0))
{
temp = tempArray[j];
index = j;
}
}
/*以上只是找到最大元素,并且判断SORT数组不为0 的时候表示已经排好序*/
if (sortResult[index] == 0) /*如果没有标记,下面其元素值+1以标记*/
{
sortResult[index] = ++k;
}
}
}
void main()
{
double x[SIZE]={1, 2, 6, 3, 6, 2, 3, 6};//此数组为待排序数组,可以在程序中给定,也可以用户从终端输入
int i,j = 0, t, n = SIZE;
double pp[SIZE];
double valTop[SIZE];
int nTopIndex[SIZE];
sort(x, nTopIndex, n);
for (i = 0; i < n; i++) /* 得到第三个数组valTop[]; */
{
valTop[nTopIndex[i] - 1] = x[i];
}
printf("/n你要找最大的几个数字?范围在[1,%d]/n",SIZE);
scanf("%d", &t);
while (t < 1 || t > SIZE)
{
printf("输入错误,请重新输入。/n");
scanf("%d", &t);
}
for (i = 0; i < SIZE; i++)
{
if(valTop[t + 1] == valTop[t])
{
t++;
}
}
for (i = 0; i < t; i++)
{
for (j = 0; j < SIZE; j++)
if (valTop[i] == x[j])
{
printf("%f, %d/n", x[j], j);
x[j] = 0;
}
}
getch();
}
算法程序分析:
此算法并非源程序思想的改写,只是利用了一般思路来实现同样的目的,本算法中采用了三个数组空间,第一个为目标数组,第二个数组用来存储目标数组中各个元素在整个数组元素中的位置关系(即按从大到小排列后此元素在数组各元素中的名词),第三个数组则按递减的顺序来保存了目标数组中的每个元素值。算法的输出结果中已经分别显示了这三个数组的index和value。算法的优点是可读性比较好,并且打印结果时考虑了元素并列的情况,相同数值的元素的输出几率相同,打印结果中附带了三个数组的赋值情况。但此算法最大的缺陷是浪费了空间。因为算法中开辟了三个数组空间,当被操作数很大的情况时候则大大浪费系统资源,时间复杂度上该算法的效率也一般,另外在输出前m名的时候对目标数组造成了部分损坏。整体上该算法效率不高!