题目地址:http://www.cnblogs.com/Trony/archive/2012/10/01/2709959.html 华为机试题目
操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越 高。函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,数组元素为-1表示结束。
例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99} system_task[] = {0, 3, 1, 7, -1} user_task[] = {4, 8, 2, 6, -1}
函数接口 void scheduler(int task[], int n, int system_task[], int user_task[])
#include<iostream> using namespace std; void scheduler(int task[],int n,int system_task[],int user_task[]) { int k=0,q=0; int s1=0,s2=0; for(int i=0;i<n;i++)//此循环将数据分别送入 system_task数组和user_task数组,但是没有对数据的优先级进行排序 { if(task[i]>255) { continue; } else if(task[i]<50) { system_task[k++]=i; s1=k; } else if(task[i]>=50&&task[i]<=255) { user_task[q++]=i; s2=q; } } system_task[s1]=-1;//将数据分别送入 system_task数组和user_task数组后,按照题目往后面加入'-1' system_task[s1+1]=0; user_task[s2]=-1; user_task[s2+1]=0; for(int i=0;i<s1-1;i++)//对system_task数组进行排序, for(int j=i+1;j<s1;j++) { int t; if(task[system_task[i]]>task[system_task[j]])//注意:system_task数组存放的就是task数组的下标,可以直接读取下标. { t=system_task[j]; //比较的是task值的大小,移动的是下标, system_task[j]=system_task[i];//将task值小的,下标往前移动, system_task[i]=t; } } for(int i=0;i<s2-1;i++)//相似原理 for(int j=i+1;j<s2;j++) { int t; if(task[user_task[i]]>task[user_task[j]]) { t=user_task[j]; user_task[j]=user_task[i]; user_task[i]=t; } } } int main() { int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}; int n=sizeof(task)/sizeof(task[0]); int system_task[10]; int user_task[10]; scheduler(task,n,system_task,user_task); int i=0,j=0; cout<<"系统任务:"; do { cout<<system_task[i]<<" "; i++; }while(*(system_task+i)!=0); cout<<endl; cout<<"用户任务:"; do { cout<<user_task[j]<<" "; j++; }while(*(user_task+j)!=0); cout<<endl; system("pause"); return 0; }