短作业优先调度算法(SJF)

假设有n项作业位于就绪队列中,这些作业的提交时间用数组requestTimes按照提交时间的先后顺序存储,对应的作业服务时间(持续时间)用数组durations存储。采用SJF算法,计算n项作业的平均等待时间。当存在多个相同长度的短作业时,按照提交时间的先后顺序进行调度。假设0<= n <= 100。求出所有作业的平均等待时间。

函数原型:void minWaitingTime(int requestTimes[],int durations[],int n)

测试用例:

输入 

4
0 2 4 5
7 4 1 4

输出:

4.0

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 #define MAX 0x7FFFFFFF
 6 
 7 void minWaitingTime(int requestTimes[],int durations[],int n)
 8 {
 9     int i,time,j,k;
10     float res;
11     int index,arriveTime,indextemp;
12     int *done = (int *)malloc(sizeof(int) * n);  //表示作业是否执行过,1表示执行完毕,0表示未执行
13     int *wait = (int *)malloc(sizeof(int) * n);  //表示等待时间
14     for(i = 0; i < n; ++i){
15         wait[i] = 0;
16         done[i] = 0;
17     }        
18 
19     time = 0;  //time表示总作业执行时间
20     for(i = 0; i < n; i++){
21         if(i == 0){  //执行第一个作业
22             time += durations[i];
23             done[i] = 1;
24             for(j = 1; j < n; j++){
25                 if(requestTimes[j] < time)
26                     wait[j] = time - requestTimes[j];
27             }
28         }
29         else{
30             index = GetMin(durations,done,n);
31             //判断是否有多个最短作业,如有选择其中先到达的
32             arriveTime = requestTimes[index];
33             for(indextemp = index + 1; indextemp < n; indextemp++){
34                 if(done[indextemp] == 0 && durations[indextemp] == durations[index] &&
35                     requestTimes[indextemp] < arriveTime)
36                     index = indextemp;
37             }
38 
39             time += durations[index];
40             done[index] = 1;
41             //执行选出的最短作业,并更新其它作业的等待时间
42             for(indextemp = 0; indextemp < n && i < n-1; indextemp++)
43                 if(done[indextemp] == 0 &&requestTimes[indextemp] < time)
44                     wait[indextemp] = time - requestTimes[indextemp];
45         }
46     }
47 
48     res = 0.0;
49     for(i = 0; i < n; i++)
50         res += wait[i];
51 
52     printf("%f
",res / n);
53 
54 }
55 //每次取出服务时间最短且示执行过的作业
56 int GetMin(int durations[],int done[],int n)
57 {
58     int i,j,min = MAX;
59     for(i = 0; i < n; i++)
60         if(durations[i] < min && done[i] == 0){
61             min = durations[i];
62             j = i;
63         }
64     return j;
65 }
66 
67 int main()
68 {
69     int requestTimes[100];
70     int durations[100];
71     int i,n;
72     scanf("%d",&n);
73     for(i = 0; i < n; i++)
74         scanf("%d",&requestTimes[i]);
75     for(i = 0; i < n; i++)
76         scanf("%d",&durations[i]);
77 
78     minWaitingTime(requestTimes,durations,n);
79 
80     system("pause");
81     return 0;
82 }
只为训练自己,时刻锤炼一个程序员最基本的技能!
原文地址:https://www.cnblogs.com/coding-wtf/p/5818153.html