7-2 作业调度算法--短作业优先 (100 分)(SJF)

前面写过了FCFS,现在奉上SJF的算法:
题目:
输入N(N>0)个作业,输入每个作业的名字,到达时间,服务时间,按照短作业优先算法,计算每个作业的完成时间,周转时间,带权周转时间(保留2位小数)。
输入格式:
第一行输入作业数目,第二行输入作业的名字,第三行输入到达时间,第四行输入服务时间。
输出格式:
按照到达时间从小到大排序,第一行输出作业的名字,第二行输出到达时间,第三行输出服务时间,第四行输出完成时间,第五行输出完成时间,第六行输出带权周转时间。

样例:
5
A B C D E
0 1 2 3 4
4 3 1 2 4
输出:
作 业 名:A B C D E
到达时间:0 1 2 3 4
服务时间:4 3 1 2 4
完成时间:4 10 5 7 14
周转时间:4 9 3 4 10
带权周转时间:1.00 3.00 3.00 2.00 2.50
代码:

import java.util.*;

public class Main {

public static void main(String[] args) {
	// TODO Auto-generated method stub		
	Scanner works=new Scanner(System.in);
	int s=Integer.parseInt(works.nextLine());	
	String Works_name=works.nextLine();
	String [] crr=Works_name.split("\\s+");			
	String Arrival_time=works.nextLine();
	String [] arr=Arrival_time.split("\\s+");
	int [] brr=new int[arr.length];			
	for(int i=0;i<arr.length;i++) {			
		brr[i]=Integer.valueOf(arr[i]);
	}				
	String Service_time=works.nextLine();
	String [] drr=Service_time.split("\\s+");
	int [] frr=new int [drr.length];		
	for(int i=0;i<drr.length;i++) {
		frr[i]=Integer.valueOf(drr[i]);
	}
	
	Job [] job=new Job[s];
	for(int i=0;i<crr.length;i++) {
		job[i]=new Job(crr[i],brr[i],frr[i],0,0,0.00);
	}
	putFinishTime(job);//短作业优先
	Bubble(job);//排序			
	/*for(int i=0;i<crr.length;i++) {//选择完成时间
		if(i==0) {
			job[i].finishTime=job[i].arriveName+job[i].needTime;
		}
		else if(job[i-1].finishTime<job[i].arriveName){
			job[i].finishTime=job[i].arriveName+job[i].needTime;
		}
		else {
			job[i].finishTime=job[i-1].finishTime+job[i].needTime;
		}
	}*/		
	for(int i=0;i<crr.length;i++) {//计算周转时间
		job[i].turnaroundTime=job[i].finishTime-job[i].arriveName;
	}		
	for(int i=0;i<crr.length;i++) {//计算带权周转时间
		job[i].turnaroundWithRight=Double.valueOf(job[i].turnaroundTime)/Double.valueOf(job[i].needTime);
	}				
	System.out.printf("作 业 名:");
	for(int i=0;i<crr.length;i++) {			
		job[i].getjobName();
		if(i<crr.length-1) {
			System.out.printf(" ");
		}
	}
	System.out.printf("\n到达时间:");	
	for(int i=0;i<crr.length;i++) {			
		job[i].getarriveName();
		if(i<crr.length-1) {
			System.out.printf(" ");
		}
	}
	System.out.printf("\n服务时间:");
	for(int i=0;i<crr.length;i++) {			
		job[i].getneedTime();
		if(i<crr.length-1) {
			System.out.printf(" ");
		}
	}
	System.out.printf("\n完成时间:");
	for(int i=0;i<crr.length;i++) {			
		job[i].getfinishTime();
		if(i<crr.length-1) {
			System.out.printf(" ");
		}
	}
	System.out.printf("\n周转时间:");
	for(int i=0;i<crr.length;i++) {			
		job[i].getturnaroundTime();
		if(i<crr.length-1) {
			System.out.printf(" ");
		}
	}
	System.out.printf("\n带权周转时间:");
	for(int i=0;i<crr.length;i++) {			
		job[i].getturnaroundWithRight();
		if(i<crr.length-1) {
			System.out.printf(" ");
		}
	}
	System.out.println("");
	works.close();
}
static void putFinishTime(Job job[]) {
	Bubble(job);//先按到达时间排序
	job[0].finishTime=job[0].arriveName+job[0].needTime;
	int sub=0;
	for(int i=1;i<job.length;i++) {
		int start=0,end=0;
		start=i;
		for(int j=i;j<job.length;j++) {				
			if(job[sub].finishTime>=job[j].arriveName) {
				end=j;
			}
			else
				break;
		}				
		if(end!=0) {
			putNeedTime(job,start,end);//按周转时间排序
			if((end-start==0)||!(Judge(job,start,end))) {//只有一个进程或两个及以上进程的 没有进程周转时间与第一个短进程相同
				job[start].finishTime=job[sub].finishTime+job[start].needTime;
			}
			else {					
				Seek(job,start,end);//找出与第一个短进程周转时间相同且到达时间更小的的进程交换位置FCFS
				job[start].finishTime=job[sub].finishTime+job[start].needTime;
			}				
		}
		else {				
			job[start].finishTime=job[start].arriveName+job[start].needTime;
		}
		sub=start;
	}			
}
static void Seek(Job job[],int start,int end) {
	Job temp=new Job("",0,0,0,0,0.00);
	//int tamp=job[start].arriveName;
	for(int j=start+1;j<=end;j++) {//打擂台,找出相同周转时间下谁的到达时间最小
		if(job[start].needTime==job[j].needTime&&job[j].arriveName<job[start].arriveName) {
			//tamp=job[j].arriveName;
			temp=job[j];
			job[j]=job[start];
			job[start]=temp;
		}
	}
}
static boolean Judge(Job job[],int start,int end) {
	boolean flag=false;
	for(int i=start;i<end;i++) {
		for(int j=i+1;j<=end;j++) {
			if((job[j].needTime==job[i].needTime)&&(i==start)) {
				flag=true;					
			}
			else {
				break;
			}
		}			
	}
	return flag;
}
static void putNeedTime(Job job[],int start,int end){
	Job temp=new Job("",0,0,0,0,0.00);//临时变量
	boolean flag=false;
	for(int i=start;i<end;i++) {//冒泡排序
		for(int j=start;j<end+start-i;j++) {
			if(job[j].needTime>job[j+1].needTime) {	
				flag=true;
				temp=job[j];
				job[j]=job[j+1];
				job[j+1]=temp;
			}
		}
		if(!flag) {
			break;
		}
		else {
			flag=false;
		}
	}
}

static void Bubble(Job job[]){
	Job temp=new Job("",0,0,0,0,0.00);
	boolean flag=false;
	for(int i=0;i<job.length-1;i++) {
		for(int j=0;j<job.length-1-i;j++) {
			if(job[j].arriveName>job[j+1].arriveName) {
				flag=true;
				temp=job[j];
				job[j]=job[j+1];
				job[j+1]=temp;
			}
		}
		if(!flag) {
			break;
		}
		else {
			flag=false;
		}
	}
}

}

class Job{
public String jobName;
public int arriveName;
public int needTime;
public int finishTime;
public int turnaroundTime;
public double turnaroundWithRight;
public Job(String jobName,int arriveName,int needTime,int finishTime,int turnaroundTime,double turnaroundWithRight) {
this.jobName=jobName;
this.arriveName=arriveName;
this.needTime=needTime;
this.finishTime=finishTime;
this.turnaroundTime=turnaroundTime;
this.turnaroundWithRight=turnaroundWithRight;
}
public void getjobName() {
System.out.printf("%s",jobName);
}
public void getarriveName() {
System.out.printf("%d",arriveName);
}
public void getneedTime() {
System.out.printf("%d",needTime);
}
public void getfinishTime() {
System.out.printf("%d",finishTime);
}
public void getturnaroundTime() {
System.out.printf("%d",turnaroundTime);
}
public void getturnaroundWithRight() {
System.out.printf("%-3.2f",turnaroundWithRight);
}
}
java语言,eclipse环境,转载麻烦@原出处Thanks♪(・ω・)ノ;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值