1. 程式人生 > >磁碟排程演算法(FCFS,SSTF,SCAN)

磁碟排程演算法(FCFS,SSTF,SCAN)

#include<bits/stdc++.h>
using namespace std;
int a[2000]; //磁軌位置 
int n; //磁軌數量 
int begin;  //初始位置 
void init()
{
	srand(time(0));
	n=(rand()%20)+1; // 0-1000
	for(int i=0;i<n;i++)
	a[i]=(rand()%20)+1; //0-1000
	begin= (rand()%20)+1; 
}
int abs(int x)
{
	return x<0?-x:x;
}
int er_fen(int b[],int x)
{
	int l=0,r=n-1;
	//printf("r=%d\n",r);
	while(l<=r)
	{
		int mid=(l+r)>>1;
		if(b[mid]>x)
		{
			r=mid-1;
		}
		else
		l=mid+1;
	}
	//printf("! %d %d %d\n",x,l,r);
	return r;
}
void FCFS() //先來先服務 
{
	int sum=0;
	printf("路徑:\n");
	printf("%d",begin);
	int t=begin;   //為了不改變起始點 
	for(int i=0;i<n;i++)  
	{
		sum+=abs(t-a[i]);
		printf(" --> %d",a[i]);
		t=a[i];
	}
	printf("\n");
	printf("總移動數: %d\n",sum);
} 
void SSTF() //用二分搜尋優化  時間複雜度 O(nlogn) 
{
	int sum=0;
	int b[2000];
	int vis[2000]={0}; //記錄訪問過的點 
	for(int i=0;i<n;i++) //為了不改變原始資料 
	b[i]=a[i];
	int t=begin;
	sort(b,b+n);  //排序用於二分 
	
	printf("路徑:\n");
	printf("%d",begin);
	for(int i=0;i<n;i++)
	{
		int s=er_fen(b,t);  //二分
		int l=s,r=s+1;
		while(l>=0&&vis[l])
		{
			l--;
		} 
		while(r<n&&vis[r])
		{
			r++;
		}
		if(l>=0&&!vis[l]&&abs(b[l]-t)<abs(b[r]-t))
		{
			sum+=abs(b[l]-t);
			vis[l]=1;
			t=b[l];
		}
		else
		{
			sum+=abs(b[r]-t);
			vis[r]=1;
			t=b[r];
		}
		printf(" --> %d",t);
	} 
	printf("\n");
	printf("總移動數: %d\n",sum);
}
void SCAN_down() //電梯法先下降 
{
	int sum=0;
	int b[2000];
	for(int i=0;i<n;i++) //為了不改變原始資料 
	b[i]=a[i];
	int t=begin;
	sort(b,b+n);  //排序用於二分
	int s=er_fen(b,t);
	printf("路徑:\n");
	printf("%d",begin);
	for(int i=s;i<n;i++)  
	{
		sum+=abs(t-b[i]);
		printf(" --> %d",b[i]);
		t=b[i];
	}
	for(int i=0;i<s;i++)
	{
		sum+=abs(t-b[i]);
		printf(" --> %d",b[i]);
		t=b[i];
	}
	printf("\n");
	printf("總移動數: %d\n",sum);
}
void SCAN_up()  //電梯法先上升 
{
	int sum=0;
	int b[2000];
	for(int i=0;i<n;i++) //為了不改變原始資料 
	b[i]=a[i];
	int t=begin;
	sort(b,b+n);  //排序用於二分
	int s=er_fen(b,t);
	printf("路徑:\n");
	printf("%d",begin);
	for(int i=0;i<=s;i++)  
	{
		sum+=abs(t-b[i]);
		printf(" --> %d",b[i]);
		t=b[i];
	}
	for(int i=s+1;i<n;i++)
	{
		sum+=abs(t-b[i]);
		printf(" --> %d",b[i]);
		t=b[i];
	}
	printf("\n");
	printf("總移動數: %d\n",sum);
} 
int main()
{
	init();
	printf("FCFS:\n");
	FCFS(); 
	printf("SSTF:\n");
	SSTF(); 
	printf("SCAN(down):\n");
	SCAN_down();
	printf("SCAN(up):\n");
	SCAN_up();
}