短作业优先调度算法

短作业优先(SJF, Shortest Job First)又称为“短进程优先”SPN(Shortest Process Next);是对FCFS算法的改进,其目标是减少平均周转时间。
短作业优先调度算法基于这样一种思想:
运行时间短的优先调度;
如果运行时间相同则调度最先发起请求的进程。
等待时间:一个进程从发起请求到开始执行的时间间隔。
现在有n个进程请求cpu,每个进程用一个二元组表示:(p,q),p代表该进程发起请求的时间,p代表需要占用cpu的时间。
请计算n个进程的平均等待时间。

输入描述:

输入包含多组测试数据。
对于每组测试数据,第一行为一个整数n。
然后有n行,每行两个整数,代表上述的二元组(p,q).
保证:
2<=n<=2000,1<=p<=300,1<=q<=100.

import java.util.*;
public class Main{

   public static class Job implements Comparable{
           public int request;
           public int cpu;

        public int compareTo(Object o) {
            // TODO Auto-generated method stub
            Job job=(Job)o;
            if(job.request==request)
                if(cpu<job.cpu) return -1;
                else if(cpu>job.cpu) return 1; 
                else return 0;
            else if(request<job.request){
                return -1;
            }else return 1;
        }       
        }

     public float avgWait(int n, ArrayList<Job> jobs){
         Collections.sort(jobs);
         float wait=0;
         int now=jobs.get(0).request;
         while(jobs.size()>0){          
             int i=0,j=0;            
             Job job=jobs.get(i++);
             if(now<=job.request) {now+=job.cpu; jobs.remove(0); continue;}
             else{
                 while(i<jobs.size()){
                     Job jb=jobs.get(i++);
                     if(jb.request<=now&&jb.cpu<job.cpu) {
                         job=jb;
                         j=i-1;
                     }                   
                     }
                 wait=wait+now-job.request;
                 now+=job.cpu; 
                 jobs.remove(j);
            }                
             }                   
         return wait/n;
     }

    public static void main(String[] args){      
        Scanner scan=new Scanner(System.in);
        while(scan.hasNext()){
            int n=scan.nextInt();
            ArrayList<Job> jobs=new ArrayList<Job>();
            for(int i=0;i<n;i++){
                Job job=new Job();                
                job.request=scan.nextInt();
                job.cpu=scan.nextInt();
                jobs.add(job);
            }          
            System.out.println((new Main()).avgWait(n,jobs));
        }
    }
}
#include //定义一个结构体 struct sjf{ char name[10]; //进程名 float arrivetime; //到达时间 float servicetime;//服务时间 float starttime; //开始时间 float finishtime;//完成时间 float zztime;//周转时间 float dqzztime;//带权周转 }; //定义一个结构体数组 sjf a[100]; //定义一个输入函数 void input(sjf *p,int N) { int i; printf("intput the process's name & arrivetime & servicetime:\nfor exmple: a 0 100\n"); for(i=0;i<=N-1;i++) { printf("input the %dth process's information:\n",i+1); scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime); } } //定义一个输出函数 void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N) { int k; printf("run order:");//执行顺序 printf("%s",p[0].name); for(k=1;k%s",p[k].name); } printf("\nthe process's information:\n"); printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n"); for(k=0;k<=N-1;k++) { printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime); } } //按到达时间排序 void sort(sjf *p,int N) { for(int i=0;i<=N-1;i++) for(int j=0;j<=i;j++) if(p[i].arrivetime<p[j].arrivetime) { sjf temp; temp=p[i]; p[i]=p[j]; p[j]=temp; } } //运行阶段 void deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N) { int k; for(k=0;k=p[k].arrivetime) { p[k].starttime=p[k-1].finishtime;} else { p[k].starttime =p[k].arrivetime;} p[k].finishtime=p[k].starttime+p[k].servicetime; } } for(k=0;k<=N-1;k++) { p[k].zztime=p[k].finishtime-p[k].arrivetime;//周转时间=完成时间-到达时间 p[k].dqzztime=p[k].zzti
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值