//SSTF算法
#include<stdio.h>
#include<stdlib.h>
//判断下一个访问的元素:此处用作差法找到与当前访问元素差最小的,即是下次需要访问的元素
int Pass(int arr[9],int next){
//访问过的元素设为“无穷大”(此处设为9999),以防下次再访问到
arr[next]=9999; //差值最小的磁道访问完毕后,将其设置为9999,意为无穷大,以保证下次它不会再被访问到
}
//通过比较与当前值差值的大小,将差最小的元素定为下一个访问的元素
int Next(int sub[],int arr[],int &now,int &sub_all){
int k=0;
int min_index=0; //记录最小磁道差的下标
int sub_min=0; //最小磁道差值
sub_min=sub[0]; //假设差值最小为sub[0]时
for(k=1;k<9;k++){ //比大小,最小的就是下次要访问的
if(sub[k]<sub_min){
sub_min=sub[k];
min_index=k;
}
}
printf("%d ",arr[min_index]); //输出下次访问元素 ,sub[min_index]对应arr[min_index] ,故下次访问的是arr[min_index]
now=arr[min_index]; //下次访问的元素
sub_all+=sub_min;
Pass(arr,min_index); //返回下次访问的下标,下次访问的是arr[k],将其送往“Pass”函数,用来将访问过的元素置为∞(9999),作差也会趋于∞,故下次不会被访问到
}
int Minus(int i,int arr[],int sub[],int &now,int &sub_all){ //遍历访问序列,作差
int sub_min=0; //设置磁道差值最小的变量sub_min
int j=0,k=0; //初始化j,k,用于循环
for(j=0;j<9;++j){ //与遍历到的当前元素now做差,不用与自身做比较 。其中j对应arr数组的下标,即sub[j]是arr[j]
sub[i]=9999; //自身是arr[i],故将sub[i]置为9999,下次不会被访问到
if(j!=i){
sub[j]=abs(arr[j]-now); //将数组arr中的每一个元素分别与now做差,与arr[i]对应的是sub[i],因为不用和自身作差,所以也就是减8次
}
}
Next(sub,arr,now,sub_all); //比较差之间的大小
}
int main(){
int arr[9]={9999,98,183,37,122,14,124,65,67}; //请求访问序列
int sub[9]={0}; //用于保存磁道之间的差值
int now=0; //表示当前访问的磁道
int i=0; //表示第i轮。用于每一轮的作差和比较
now=53; //当前访问磁道是53
int sub_all=0; //总经过磁道数
printf("移动顺序是:53 ");
for(i=0;i<8;i++){ //需要做9-1=8轮
Minus(i,arr,sub,now,sub_all); //,sub_all); //作差
}
printf("\nSSTF:磁盘移动了%d个柱面\n",sub_all);
return 0;
}
SSTF算法
最新推荐文章于 2023-10-29 20:32:58 发布