最短作业优先---SJF

这里写图片描述
这里写图片描述

#include "iostream"
#include "algorithm"
#include "math.h"
#define max(a, b) a > b ? a : b;

using namespace std;

struct JB
{
    int r;   //提出请求时间
    int d;   //服务时间
    float s;   //开始服务时间
    float f;   //完成服务时间
};

JB jb[100];

bool cmp(JB &jb1, JB &jb2)
{
    if(jb1.d < jb2.d)
        return true;
    else if(jb1.d == jb2.d)
        return jb1.r < jb2.r;
    else
        return false;
}

void swap(JB &jb1, JB &jb2)
{
    JB tmp = jb1;
    jb1 = jb2;
    jb2 = tmp;
}

//n表示请求数
float waitingTimeSJF(int requestTimes[], int durations[], int n)
{
    int i;
    for(i=0; i<n; i++)
    {
        jb[i].r =  requestTimes[i];
        jb[i].d = durations[i];
    }
    sort(jb+1, jb+n, cmp);  
    float sum = 0;
    for(i=0; i<n; i++)
    {
        if(i == 0)
        {
            jb[i].s = jb[i].r;
            jb[i].f = jb[i].r + jb[i].d;
        }
        else
        {
            if(jb[i].r <= jb[i-1].f)  //如果提出请求的时间比上一个任务完成的时间早
            {
                jb[i].s = jb[i-1].f;
                jb[i].f = jb[i].s + jb[i].d;
            }
            else          //上个任务已经完成,为了使机器不停歇,找一个提出请求时间早且持续时间短的任务
            {
                int j = i + 1;
                while(jb[j].r > jb[i-1].f)   
                    j++;
                swap(jb[i], jb[j]);    //与当前的任务交换一下顺序
                jb[i].s = jb[i-1].f;
                jb[i].f = jb[i].s + jb[i].d;
            }
        }
    }
    for(i=0; i<n; i++)
    {
        sum += jb[i].s - jb[i].r;
    }
    return sum / (float)n;
}

int main()
{
    //int r[] = {0, 1, 3, 9};
    //int d[] = {2, 1, 7, 5};
    int r[] = {0, 2, 4, 5};
    int d[] = {7, 4, 1, 4};
    float tt = waitingTimeSJF(r, d, 4);
    cout << tt << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值