方法解释:点击打开链接
代码:
package exper3;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Disk {
private boolean bool;
public void BubbleSortint(int num,int str[]){
for(int i=0;i<num-1;i++)
{
bool=true;
for(int j=0;j<num-i-1;j++){
if(str[j]>str[j+1])
{
int temp=str[j];
str[j]=str[j+1];
str[j+1]=temp;
bool=false;
}
}
if(bool)
break;
}
System.out.print("数组经过冒泡排序后(升序):");
for(int i=0;i<num;i++){
System.out.print(str[i]+" ");
}
System.out.println();
}
public void BubbleSortlist(List<Integer> list1){
for(int i=0;i<list1.size()-1;i++){
bool=true;
for(int j=0;j<list1.size()-i-1;j++){
if(list1.get(j)>list1.get(j+1)){
int temp=list1.get(j);
list1.set(j,list1.get(j+1));
list1.set(j+1,temp);
bool=false;
}
}
if(bool){
break;
}
}
System.out.print("集合经过冒泡排序后(升序):");
for(int i=0;i<list1.size();i++){
System.out.print(list1.get(i)+" ");
}
System.out.println();
}
public void Scan(int num,int start,int[] str,String arrow){
int sum=0;
int mem2=0;
int[] mem3=new int[num];
for(int i=0;i<num-1;i++){
if(start>str[i] && start<=str[i+1]){
if(arrow.equals("in")){ //磁头位于磁道的中间,且更靠近后边
int mem1=i;
int w=0;
for(int j=i+1;j<num;j++){
mem2=str[j]-start;
sum=sum+mem2;
start=str[j];
mem3[w++]=str[j];
}
for(int k=i;k>=0;k--){
mem2=start-str[k];
sum=sum+mem2;
start=str[k];
mem3[w++]=str[k];
}
break;
}else if(arrow.equals("out")){ //磁头位于磁道的中间,且更靠近前边
int mem1=i;
int w=0;
for(int k=i;k>=0;k--){
mem2=start-str[k];
sum=sum+mem2;
start=str[k];
mem3[w++]=str[k];
}
for(int j=i+1;j<num;j++){
mem2=str[j]-start;
sum=sum+mem2;
start=str[j];
mem3[w++]=str[j];
}
break;
}
}else if(i==num-1 && str[i]<=start ){ //磁头位于磁道的最右侧
int w=0;
for(int k=num-1;k>=0;k--){
mem2=start-str[k];
sum=sum+mem2;
start=str[k];
mem3[w++]=str[k];
}
break;
}else if(i==num-1 && str[i]>=start ){ //磁头位于磁道的最左侧
int w=0;
for(int k=0;k<num;k++){
mem2=start-str[k];
sum=sum+mem2;
start=str[k];
mem3[w++]=str[k];
}
break;
}
}
System.out.print("磁头移动的轨迹:");
for(int i=0;i<num;i++){
System.out.print(mem3[i]+" ");
}
System.out.println();
System.out.println("平均磁道长度:"+(sum)/num);
}
public void Sstf(int num,List<Integer> list1,int start){
int sum=0;
int[] mem3=new int[num];
int w=0;
for(int j=0;j<list1.size();j++){
Boolean bool=true;
for(int i=0;i<list1.size()-1;i++){
if(start>list1.get(i) && start<=list1.get(i+1)){
if(start-list1.get(i)>list1.get(i+1)-start){
sum=sum+list1.get(i+1)-start;
start=list1.get(i+1);
mem3[w++]=list1.get(i+1);
list1.remove(i+1);
BubbleSortlist(list1);
bool=false;
break;
}
else{
sum=sum+start-list1.get(i);
start=list1.get(i);
mem3[w++]=list1.get(i);
list1.remove(i);
BubbleSortlist(list1);
bool=false;
break;
}
}
}
if(bool)
break;
}
int m=list1.size();
if(start<list1.get(0)){
for(int i=0;i<m;i++){
sum=sum+list1.get(0)-start;
start=list1.get(0);
mem3[w++]=list1.get(0);
list1.remove(0);
BubbleSortlist(list1);
}
}
System.out.print("磁头移动的轨迹:");
for(int i=0;i<num;i++){
System.out.print(mem3[i]+" ");
}
System.out.println();
System.out.println("平均磁道长度:"+sum/num);
}
public static void main(String args[]){
Disk dsk=new Disk();
Scanner sc=new Scanner(System.in);
boolean choose=true;
while(choose){
System.out.println("请输入您选择的功能序列号:");
System.out.println("1:采用Scan算法进行磁盘序列调度");
System.out.println("2: 采用Sstf算法进行磁盘序列调度");
System.out.println("3:退出此程序");
int choice=sc.nextInt();
if(choice==1){
System.out.print("请输入访问磁盘的个数:");
int num=sc.nextInt();
System.out.print("请输入磁盘访问序列:");
int[] str=new int[8];
for(int i=0;i<num;i++){
str[i]=sc.nextInt();
}
System.out.print("请输入读写头起始位置:");
int start=sc.nextInt();
System.out.print("请选择磁盘调度方向:如果选择向里,输入in;如果选择向外,输入out");
String arrow=sc.next();
dsk.BubbleSortint(num,str);
dsk.Scan(num,start,str,arrow);
}else if(choice==2){
System.out.print("请输入访问磁盘的个数:");
int num=sc.nextInt();
System.out.print("请输入磁盘访问序列:");
List<Integer> list1=new ArrayList<>();
for(int i=0;i<num;i++){
list1.add(sc.nextInt());
}
System.out.print("请输入读写头起始位置:");
int start=sc.nextInt();
dsk.BubbleSortlist(list1);
dsk.Sstf(num,list1,start);
}else if(choice==3){
System.exit(0);
sc.close();
}else{
System.out.println("输入错误,请重新输入功能序列号。");
}
}
}
}