磁碟排程演算法其一(電梯演算法)
迴圈掃描演算法CSCAN:CSCAN演算法規定磁頭單向移動,例如,只是自裡向外移動,當磁頭移到最外的磁軌並訪問後,磁頭立即返回到最裡的欲訪問的磁軌,亦即將最小磁軌號緊接著最大磁軌號構成迴圈,進行迴圈掃描。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void time_random(int *t)//定義取時間隨機數
{
int i,number=0;
srand((unsigned) time(NULL)); //用時間做種,每次產生隨機數不一樣,但還是可能會相同
for (i=0; i<20; i++)//取三十個隨機數,放入陣列t中
{
number = rand() % 201;//對21取餘
while(number==0)//若餘數為0,則一直取到不為0為止
number = rand() % 21; //產生1-20的隨機數
t[i]=number; //將隨機數賦給陣列
}
}
void Print(int *a)//列印陣列函式
{
for(int i=0;a[i]!='\0';i++)//列印每一次排序的結果
printf("%d ",a[i]);
printf("\n");//輸個換行符
}
void Insert(int *a)//插入排序
{
int j;int k;
int temp = 0;
for(int i=1;a[i]!='\0';i++)//假設第一個元素已經是有序佇列
{
for(j=0;j<i&&a[j]<a[i];)
j++;
if(i!=j)
{
temp = a[i];
for(k = i-1;k>=j;k--)
a[k+1]=a[k];
a[j] = temp;
}
}
}
void change(int *a,int *b)
{
int i,j = 0;
for(i = 1;j<15;i++)
{
if(a[i]!=a[i-1])
{
b[j]=a[i-1];
j++;
}
}
b[15]='\0';
}
void run(int *x)
{
int loc ;
int avglength;
for(loc = 0;loc<15&&x[loc]<100;loc++)
;//空語句,只為 loc++
avglength = x[14]*2-x[0]-100;
avglength /=15;
for(int i = loc;i<15;i++)
{
printf("\n%3d訪問",x[i]);
x[i] = '0';
}
for(int j = loc-1;j>=0;j--)
{
printf("\n%3d訪問",x[j]);
x[j] = '0';
}
printf("\n\n平均尋道長度:%d",avglength);
}
int main()
{
int t[21]={0};
int tx[16];
time_random(t);
Insert(t);
printf("磁頭在100號磁軌上,並向磁軌號增加的方向上移動\n");
printf("\n15個程序訪問磁碟:\n");
change(t,tx);
Print(tx);
//開始執行
run(tx);
return 0;
}