SSTF算法

//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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值