1. 程式人生 > >華為:作業系統任務排程問題

華為:作業系統任務排程問題

/*
作業系統任務排程問題。作業系統任務分為系統任務和使用者任務兩種。
其中,系統任務的優先順序 < 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} 
函式介面 void scheduler(int task[], int n, int system_task[], int user_task[]) 
*/

#include<cstdio> 
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std;
int compare(const void *a,const void *b)
{
	return *(int *)a-*(int *)b;
}
void scheduler(int task[], int n, int system_task[], int user_task[]) 
{ 
	int i,j,k,tmp; 
	int r=0,s=0; 
	int *task_order = (int *)malloc(n*sizeof(int)); 
	for(i=0;i<n;i++) 
		task_order[i] = task[i]; 
	for(i=0;i<n;i++) 
		cout<<task_order[i]<<"  ";
	cout<<endl;
	
	/******************************************
	for(j=0;j<n-1;j++) 
		for(k=j+1;k<n;k++) 
			if(task_order[j]>task_order[k]) 
			{ 
				tmp=task_order[j]; 
				task_order[j]=task_order[k]; 
				task_order[k]=tmp; 
			}
	********************************************/
	qsort(task_order,n,sizeof(task_order[0]),compare);

	for(i=0;i<n;i++) 
		cout<<task_order[i]<<"  ";
	cout<<endl;
	/******************************************
	for(i=0;i<n;i++) 
	{ 
		if(task_order[i]<50) 
		{ 
			system_task[r++]=task_order[i];
		} 
		else if(task_order[i]>=50 && task_order[i]<255) 
		{ 
			 user_task[s++]=task_order[i];
		}
	 
	}
	system_task[r]=-1;
	user_task[s]=-1;
	********************************************/
	i=0;
	while(task_order[i]<50)i++;
	int pivot=i;
	for(i=0;i<pivot;i++)
	{
		system_task[i]=task_order[i];
	}
	system_task[i]=-1;
	for(i=pivot;i<n;i++)
	{
		user_task[i-pivot]=task_order[i];
	}
	user_task[i-pivot]=-1;

	free(task_order); 
} 
int main(/*int argc, char **argv*/) 
{ 
	int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}; 
	int system_task[9]={0}; 
	int user_task[9]={0}; 
	int i; 
	scheduler(task,9,system_task,user_task); 
	for(i=0;i<9;i++) 
		printf("%d ",system_task[i]); 
	printf("\n"); 
	for(i=0;i<9;i++) 
		printf("%d ",user_task[i]); 
 
	return 0; 
}