首次适应算法和最佳适应算法和循环首次适应算法和最坏适应算法

#include<iostream>
using namespace std;


int FreePartition[100];//空闲分区块数组
int FirstPartition[100];//首次适应算法数组
int CycleFirstPartition[100];//循环首次适应算法数组
int BestPartition[100];//最佳适应算法数组
int WorstPartition[100];//最坏适应算法数组
int ProcessNeed[100];//每个作业的大小
int PartitionNum,ProcessNum;//分区块数,作业数


//首次适应算法
void First()
{
int i,j;
char str;
for(i=0;i<PartitionNum;i++)
{
FirstPartition[i]=FreePartition[i];
}
for(i=0;i<ProcessNum;i++)//找出第一块满足作业的分区
for(j=0;j<PartitionNum;j++)
{
if(ProcessNeed[i]>FirstPartition[j])
continue;
else
{
FirstPartition[j]-=ProcessNeed[i];//找到后把分区大小减去作业的大小
                str='A'+i;
cout<<"作业"<<str<<"在第"<<j+1<<"块分区中"<<endl;
break;
}
}
cout<<endl;
cout<<"分配之后剩余情况:"<<endl;
    for(i=0;i<PartitionNum;i++)
cout<<FirstPartition[i]<<" ";
cout<<endl<<endl;
}


//循环首次适应算法
void CycleFirst()
{
int i,j=1;
char str;
for(i=0;i<PartitionNum;i++)
{
CycleFirstPartition[i]=FreePartition[i];
}
for(i=0;i<ProcessNum;i++)
//for(j=0;j<PartitionNum;j++)
{
j=j-1;
while(j<PartitionNum)
{
if(ProcessNeed[i]>CycleFirstPartition[j])
//continue;
j++;
else
{
CycleFirstPartition[j]-=ProcessNeed[i];
str='A'+i;
cout<<"作业"<<str<<"在第"<<j+1<<"块分区中"<<endl;
break;
}
//j++;
//cout<<j<<" ";
if(j==PartitionNum && i!=ProcessNum)
{
i=-1;
}
}
}
cout<<endl;
cout<<"分配之后剩余情况:"<<endl;
for(i=0;i<PartitionNum;i++)
cout<<CycleFirstPartition[i]<<" ";
cout<<endl<<endl;


}


//最佳适应算法
void Best()
{
int i,j,k;
char str;
    for(i=0;i<PartitionNum;i++)
{
BestPartition[i]=FreePartition[i];
}
for(i=0;i<ProcessNum;i++)
{
k=0;
for(j=0;j<PartitionNum;j++)
{
//cout<<BestPartition[j]<<"   "<<ProcessNeed[i]<<endl;
if(BestPartition[j]>=ProcessNeed[i])
{
k=j;
break;
}
}
 for(int n=0;n<PartitionNum;n++)
 {
    if(BestPartition[n]<BestPartition[k] && BestPartition[n]>=ProcessNeed[i])//找最佳的
   k=n;
 }
BestPartition[k]-=ProcessNeed[i];
str='A'+i;
cout<<"作业"<<str<<"在第"<<j+1<<"块分区中"<<endl;
}
cout<<endl;
cout<<"分配之后剩余情况:"<<endl;
for(i=0;i<PartitionNum;i++)
cout<<BestPartition[i]<<" ";
cout<<endl<<endl;


}


//最坏适应算法
void Worst()
{
int i,j,k;
char str;
for(i=0;i<PartitionNum;i++)
{
WorstPartition[i]=FreePartition[i];
}
for(i=0;i<ProcessNum;i++)
{
k=0;
for(j=0;j<PartitionNum;j++)
{
if(WorstPartition[j]>WorstPartition[k])//找到最大的分区
  k=j;
}
WorstPartition[k]-=ProcessNeed[i];
str='A'+i;
cout<<"作业"<<str<<"在第"<<j+1<<"块分区中"<<endl;
}
cout<<endl;
cout<<"分配之后剩余情况:"<<endl;
for(i=0;i<PartitionNum;i++)
cout<<WorstPartition[i]<<" ";
cout<<endl<<endl;
}


int main()
{
int i;
cout<<"输入分区块数:"<<endl;
cin>>PartitionNum;
cout<<"输入每个分区的大小:"<<endl;
for(i=0;i<PartitionNum;i++)
cin>>FreePartition[i];
cout<<"输入作业数:"<<endl;
cin>>ProcessNum;
cout<<"输入每个作业的大小:"<<endl;
for(i=0;i<ProcessNum;i++)
cin>>ProcessNeed[i];
cout<<"------------首次适应算法-----------------"<<endl;
First();
cout<<"------------循环首次适应算法-------------"<<endl;
    CycleFirst();
cout<<"------------最佳适应算法-----------------"<<endl;
Best();
cout<<"------------最坏适应算法-----------------"<<endl;
Worst();
return 0;
}

  • 6
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
循环首次适应算法是一种动态分区分配算法,它会从空闲分区链表的头部开始查找满足需求的分区。如果找到合适的分区,则将其分割成两部分,一部分用于分配,另一部分保留在内存中。若找不到合适的分区,则继续搜索下一个分区,直至找到适合的分区或者遍历完整个空闲分区链表。 最佳适应算法是一种动态分区分配算法,它会从空闲分区链表中找到能够满足需求且大小最小的分区进行分配。这样可以尽可能地减少外部碎片,提高内存的利用率。 最坏适应算法也是一种动态分区分配算法,不同的是它会从空闲分区链表中找到能够满足需求且大小最大的分区进行分配。这样可以避免大分区的频繁分割和合并,减少内存碎片的产生。 以下是使用C语言实现这三种算法的伪代码示例: ```c // 循环首次适应算法 void* firstFit(int size) { // 遍历空闲分区链表 for (int i = 0; i < freeList.size; i++) { if (freeList.blocks[i].size >= size) { // 找到合适的分区 void* ptr = freeList.blocks[i].start; // 分割分区 freeList.blocks[i].size -= size; freeList.blocks[i].start += size; return ptr; } } return NULL; } // 最佳适应算法 void* bestFit(int size) { // 找到能满足需求且大小最小的分区 int minSize = INT_MAX; int index = -1; for (int i = 0; i < freeList.size; i++) { if (freeList.blocks[i].size >= size && freeList.blocks[i].size < minSize) { minSize = freeList.blocks[i].size; index = i; } } if (index != -1) { // 找到合适的分区 void* ptr = freeList.blocks[index].start; // 分割分区 freeList.blocks[index].size -= size; freeList.blocks[index].start += size; return ptr; } return NULL; } // 最坏适应算法 void* worstFit(int size) { // 找到能够满足需求且大小最大的分区 int maxSize = 0; int index = -1; for (int i = 0; i < freeList.size; i++) { if (freeList.blocks[i].size >= size && freeList.blocks[i].size > maxSize) { maxSize = freeList.blocks[i].size; index = i; } } if (index != -1) { // 找到合适的分区 void* ptr = freeList.blocks[index].start; // 分割分区 freeList.blocks[index].size -= size; freeList.blocks[index].start += size; return ptr; } return NULL; } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值