题目地址: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;
}