SJF短作业优先算法 C语言实现

#include<stdio.h>
#include<string.h>

struct job{
    int id;
    int starttime;//作业到达系统的时间
    int needtime;//作业服务的时间
    int endtime;//作业的结束时间
    int runtime;//作业周转的时间
    double dqzztime;//作业的带权周转时间
};

main(){
    struct job job[50];
    int n,i;//n个作业
    printf("输入作业的个数\n");
    scanf("%d",&n);
    printf("输入每个作业的id,到达时间,服务时间\n");
    for(i=0;i<n;i++){
        scanf("%d%d%d",&job[i].id,&job[i].starttime,&job[i].needtime);
    }
    printf("\n");
      printf("作业ID\t到达系统时间\t服务时间\n");
    for(i=0;i<n;i++)
    {
    	printf(" %d\t%d\t\t%d\n",job[i].id,job[i].starttime,job[i].needtime);
    }
    int b=0;
    int temp;
    int min;
    	for(i=0;i<n-1;i++){ //按作业到达系统时间进行排序,最早到达的排在最前面 
        if(job[i].starttime>job[i+1].starttime){   //把到达时间晚的赋值到min
            min=job[i].starttime;
            job[i].starttime=job[i+1].starttime;
            job[i+1].starttime=min;
 
			//把到达时间晚的赋值到min
            min=job[i].needtime;
            job[i].needtime=job[i+1].needtime;
            job[i+1].needtime=min;
				
            temp = job[i].id;
            job[i].id = job[i+1].id;
            job[i+1].id = temp;//在temp数组中排序
          }
      }
    job[0].endtime=job[0].starttime+job[0].needtime;//结束时间=到达时间+服务时间
	job[0].runtime=job[0].needtime;//周转时间=服务时间
	job[0].dqzztime=job[0].runtime*1.0/job[0].needtime;//带权周转时间=周转时间/服务时间
    for(i=1;i<n;i++){
    	if(job[i].starttime>job[i-1].endtime){     //第i个进程到达系统时,第i-1个进程已运行完毕
        	job[i].endtime=job[i].starttime+job[i].needtime; 
        	job[i].runtime=job[i].needtime;
      	}else{
            b=0;//要排序的作业的个数
            if(job[i].starttime<job[i-1].endtime){
                for(int j=i;j<n;j++){
                     if(job[j].starttime<job[i-1].endtime){
                       b=b+1; 
                     }
                }
        for(int j=i;j<b-1+i;j++){
            int mins=job[j].needtime;
            int w=j;//最小的作业时间的标志
        for(int z=j;z<b-1+i;z++){
        if(mins>job[z+1].needtime){ 
            mins=job[z+1].needtime;
            w=z+1;
        }
        } 
        	min=job[j].starttime;
        	job[j].starttime=job[w].starttime;
        	job[w].starttime=min;
                  
          	min=job[j].needtime;
          	job[j].needtime=job[w].needtime;
          	job[w].needtime=min;
 
			temp = job[j].id;		//将第二个参数的值复制给第一个参数,返回第一个参数
        	job[j].id = job[w].id;
            job[w].id = temp;
                        //按最短运行时间排序
    }
            }
			job[i].endtime=job[i-1].endtime+job[i].needtime;
         	job[i].runtime=job[i].endtime-job[i].starttime; 
      	}
      	job[i].dqzztime=job[i].runtime*1.0/job[i].needtime;
    }
 
	printf("作业名   到达时间   运行时间   完成时间   周转时间   带权周转时间\n");
    for(i=0;i<n;i++)
    {
    	printf(" %d\t     %d\t       %d\t  %d\t      %d            %.2f\n",
			job[i].id,job[i].starttime,job[i].needtime,job[i].endtime,job[i].runtime,job[i].dqzztime);
    }
}

本文在https://blog.csdn.net/bxy0806/article/details/121211454的代码上优化修改

案例

结果

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值