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的代码上优化修改

案例

结果

 

 

 

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
作业优先算法(Shortest Job First,简称 SJF)是一种常见的进程调度算法,它的核心思想是优先调度执行时间的进程。在实现上,可以采用非抢占式或者抢占式的方式。下面是一个使用 C 语言实现的非抢占式 SJF 算法的伪代码: ```c struct Process { int id; // 进程 ID int arrival_time; // 到达时间 int burst_time; // 执行时间 }; void SJF(struct Process processes[], int n) { int waiting_time[n], turnaround_time[n], completion_time[n]; int total_waiting_time = 0, total_turnaround_time = 0; // 按照到达时间升序排序 qsort(processes, n, sizeof(struct Process), cmp_arrival_time); int current_time = 0; for (int i = 0; i < n; i++) { // 找到当前时间能执行的最作业 int shortest_job = -1, shortest_time = INT_MAX; for (int j = 0; j < n; j++) { if (processes[j].arrival_time <= current_time && processes[j].burst_time < shortest_time) { shortest_job = j; shortest_time = processes[j].burst_time; } } // 更新等待时间和周转时间 waiting_time[shortest_job] = current_time - processes[shortest_job].arrival_time; turnaround_time[shortest_job] = waiting_time[shortest_job] + processes[shortest_job].burst_time; total_waiting_time += waiting_time[shortest_job]; total_turnaround_time += turnaround_time[shortest_job]; // 更新当前时间和完成时间 current_time += processes[shortest_job].burst_time; completion_time[shortest_job] = current_time; } // 输出结果 printf("Process\tArrival Time\tBurst Time\tWaiting Time\tTurnaround Time\tCompletion Time\n"); for (int i = 0; i < n; i++) { printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n", processes[i].id, processes[i].arrival_time, processes[i].burst_time, waiting_time[i], turnaround_time[i], completion_time[i]); } printf("Average waiting time: %.2f\n", (float)total_waiting_time / n); printf("Average turnaround time: %.2f\n", (float)total_turnaround_time / n); } int cmp_arrival_time(const void *a, const void *b) { return (((struct Process *)a)->arrival_time - ((struct Process *)b)->arrival_time); } ``` 其中,`Process` 结构体表示进程,`SJF` 函数实现SJF 算法,`cmp_arrival_time` 函数用于升序排序。在实现中,我们首先按照到达时间升序排序,然后依次找到当前时间能执行的最作业,更新等待时间和周转时间,并更新当前时间和完成时间。最后,输出结果并计算平均等待时间和平均周转时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值