结构推理 设计一个有效的算法,在1000个无序的元素中,挑选出其中前5个最大的元素。
【正确答案】(1)数据结构
   typedef int KeyType;
   typedef int DataType;
   typedef struct{
       KeyType key;    /*排序码字段*/
       DataType info;    /*记录的其他字段*/
   }RecordNode;
   typedef struct{
       int n;    /*n为文件中的记录个数*/
       RecordNode *record;
   }SortObject;
   (2)思路
   这里不需要整体排序,故选择一种能较快得出最终排序段的前一部分的算法改造即可,如直接选择排序、冒泡排序、堆排序算法都能最先得出前5个最大元素。综合考虑算法的时间代价,采用直接选择排序算法并加以改造即可。
   (3)算法
   函数返回一个教组,数组中存着挑出的元素,为动态分配的。
   RecordNode*Outmax(SortObject*pvector,int out){
       int i,j,k;
       RecordNode*outpart;
       RecordNode temp;
       if(out>pvector->n){
         printf("the given value is wrong!");
         return NULL;
       }
       outpart=(RecordNode*)malloc(out*sizeof(RecordNode));
       if(outpart==NULL){
         printf("No space!\n");
         return NULL;
       }
       for(i=0;i<out;i++){
         k=i:
         for(j=i+1;j<pvector->n;j++)
           if(pvector->record[j].key>pvector->record[k].key)k=j;
       if(k!=i){
         temp=pvector->record[i];
           pvector->record[i]==pvector->record[k];
           pvector->record[k]=temp;
         }
         outpart[i]=pvector->record[i];
       }
       return outpart;
   }
   (4)代价分析
   O(n×m)(设从n个元素中选出m个最大元素)。
【答案解析】