#include
#include
#include // 使用优先队列
#include
using namespace std;
// 定义作业结构体
struct Job {
int id; // 作业 ID
int arrivalTime; // 到达时间
int burstTime; // 执行时间
int completionTime; // 完成时间
int turnaroundTime; // 周转时间
int waitingTime; // 等待时间
Job(int _id, int _arrivalTime, int _burstTime) {
id = _id;
arrivalTime = _arrivalTime;
burstTime = _burstTime;
}
};
// 按到达时间排序
bool compareArrivalTime(const Job& j1, const Job& j2) {
return j1.arrivalTime < j2.arrivalTime;
}
// 定义优先队列的比较函数
struct CompareBurstTime {
bool operator()(const Job& j1, const Job& j2) {
return j1.burstTime > j2.burstTime;
}
};
void sjf(vector& jobs) {
sort(jobs.begin(), jobs.end(), compareArrivalTime);
int n = jobs.size();
vector done(n, false);
int currentTime = 0;
int completed = 0;
priority_queue<Job, vector, CompareBurstTime> pq; // 定义优先队列
while (completed < n) {
// 将当前到达的作业加入优先队列
for (int i = 0; i < n; i++) {
if (!done[i] && jobs[i].arrivalTime <= currentTime) {
pq.push(jobs[i]);
}
}
// 没有可执行的作业,时间向前推进
if (pq.empty()) {
currentTime++;
}
else {
// 执行队首作业
Job j = pq.top();
pq.pop();
currentTime += j.burstTime;
done[j.id] = true;
completed++;
// 记录完成时间等信息
j.completionTime = currentTime;
j.turnaroundTime = j.completionTime - j.arrivalTime;
j.waitingTime = j.turnaroundTime - j.burstTime;
jobs[j.id] = j;
}
}
// 输出结果
cout << "作业 到达时间 执行时间 完成时间 周转时间 等待时间" << endl;
for (int i = 0; i < n; i++) {
Job j = jobs[i];
cout << j.id << "\t" << j.arrivalTime << "\t" << j.burstTime << "\t"
<< j.completionTime << "\t" << j.turnaroundTime << "\t" << j.waitingTime << endl;
}
}
int main() {
vector jobs;
jobs.push_back(Job(0, 0, 3));
jobs.push_back(Job(1, 1, 2));
jobs.push_back(Job(2, 2, 1));
jobs.push_back(Job(3, 3, 4));
sjf(jobs);
return 0;
}