前面写过了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♪(・ω・)ノ;