以下是另一种实现方式,使用了优先队列来选择执行时间最短的作业:

#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 << "作业\t到达时间\t执行时间\t完成时间\t周转时间\t等待时间" << 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;

下面是一个简单的 C++ 代码实现了短作业优先调度算法并计算每个作业的周转时间。c++#includeiostream#includevector#includealgorithmusing namespace std; 定义作业结构体struct Job int id; 作业 ID int arrivalTime; 到达时间 int burstTime; 执行时间

原文地址: http://www.cveoy.top/t/topic/ensk 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录