Javaの高速ソート---プロセススレッドシミュレーション実験で遭遇したソート問題


前言:最近オペレーティングシステムの授業はPCBプロセスのスレッドシミュレーション実験を完成する必要があります.先生がくれたc言語版の実現コードはjavaで実現しようと思っています.それからその中でソートの問題に遭遇しました.私は高速ソートのアルゴリズムを採用して優先度ソートを行いました.私のプログラミングの菜鳥は1匹、喜ばないで噴き出しないで、また、コードの中で大量の注釈があって、心理の準備をしてください...
高速ソート原理:分治の思想に基づいてソートする.基準値(通常はシーケンスの最初の要素の値)を選択します.一度の再帰が終了すると、基準値の左側のシーケンスのすべての要素の値が基準値より小さく、基準値の右側のシーケンスのすべての要素の値が基準値より大きくなります.左右のシーケンスをそれぞれ再帰する.最終的にソート済みのシーケンスが得られます.
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