Javaの高速ソート---プロセススレッドシミュレーション実験で遭遇したソート問題
前言:最近オペレーティングシステムの授業はPCBプロセスのスレッドシミュレーション実験を完成する必要があります.先生がくれたc言語版の実現コードはjavaで実現しようと思っています.それからその中でソートの問題に遭遇しました.私は高速ソートのアルゴリズムを採用して優先度ソートを行いました.私のプログラミングの菜鳥は1匹、喜ばないで噴き出しないで、また、コードの中で大量の注釈があって、心理の準備をしてください...
高速ソート原理:分治の思想に基づいてソートする.基準値(通常はシーケンスの最初の要素の値)を選択します.一度の再帰が終了すると、基準値の左側のシーケンスのすべての要素の値が基準値より小さく、基準値の右側のシーケンスのすべての要素の値が基準値より大きくなります.左右のシーケンスをそれぞれ再帰する.最終的にソート済みのシーケンスが得られます.
原文を参考にするhttps://www.cnblogs.com/hjy9420/p/5032309.html
高速ソート原理:分治の思想に基づいてソートする.基準値(通常はシーケンスの最初の要素の値)を選択します.一度の再帰が終了すると、基準値の左側のシーケンスのすべての要素の値が基準値より小さく、基準値の右側のシーケンスのすべての要素の値が基準値より大きくなります.左右のシーケンスをそれぞれ再帰する.最終的にソート済みのシーケンスが得られます.
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println(" ?");
//
Scanner s = new Scanner(System.in);
int num = s.nextInt();
//
List listOfProcess = new ArrayList();
// ,
input(num,listOfProcess);
//
disp(listOfProcess);
//
sort(listOfProcess, 0, (listOfProcess.size()-1));
disp(listOfProcess);
}
//
private static void sort(List listOfProcess, int low, int high) {
/**
* start、end、key
* start
* end
* key , ,
*/
int start = low;
int end = high;
int key = listOfProcess.get(low).getPriority();
/**
* ,
* , , ,
*/
while (end > start){
/**
*
*
* 1、 end>start?
* 。
* : end , start 。
*
* 2、 listOfProcess.get(end).getPriority() >= key?
* end 。
* , 。 , ,end
*/
while (end > start && listOfProcess.get(end).getPriority() >= key){
end--;
}
//start end , end , ,end end ,
if (listOfProcess.get(end).getPriority() <= key){
PCB temp = listOfProcess.get(end);
listOfProcess.set(end, listOfProcess.get(start));
listOfProcess.set(start, temp);
}
// , , ,start start
while (end > start && listOfProcess.get(start).getPriority() <= key){
start++;
}
//start end , start , ,start start ,
if (listOfProcess.get(start).getPriority() >= key){
PCB temp = listOfProcess.get(end);
listOfProcess.set(end, listOfProcess.get(start));
listOfProcess.set(start, temp);
}
}
/**
* ,
*
* 1、 low < start、high > end?
* , start , ok,
*
* 2、start -1,end +1?
* start end ,
* ,
*
*/
if (low < start){
sort(listOfProcess, low, start-1);
}
if (high > end){
sort(listOfProcess, end+1, high);
}
}
/* , */
private static void disp(List listOfProcess) {
System.out.println("qname \t state \t super \t ndtime \t runtime");
for (PCB pcb: listOfProcess) {
System.out.println(pcb.getName()+" \t "+ pcb.getState()+" \t "+pcb.getPriority()+" \t\t "+pcb.getNtime()+" \t\t\t "+pcb.getRtime());
}
}
/* */
private static void input(int num, List listOfProcess) {
Scanner s = new Scanner(System.in);
//
for (int i = 0; i < num; i++){
System.out.println(" :");
String name = s.next();
System.out.println(" :");
int priority = s.nextInt();
System.out.println(" :");
int ntime = s.nextInt();
System.out.println();
// PCB
PCB pcb = new PCB(name,"wait",priority,ntime,0);
//
listOfProcess.add(pcb);
}
}
}
原文を参考にするhttps://www.cnblogs.com/hjy9420/p/5032309.html