解答例 海谷ホームページ | 問題へ戻る | 学科

問題1

解答例のダウンロード
class Sorter extends Thread{
private TextField[] obj; // reference to data

    Sorter(TextField[] l){ obj=l; }

    // support function: get integer value
    private int val(TextField l){
        return Integer.parseInt(l.getText());
    }

    // support function: set integer value
    private void set(TextField l, int v){
        //l.setBackground(Color.red);
        l.setText(v+"");
        //l.setBackground(Color.white);
    }

    // Bootstrap for Sort Engine
    public void run(){
        new QSorter(obj, 0, obj.length-1).run();
    }
}

class QSorter{
private TextField[] obj; // reference to data
private int left;
private int right;

    // obj[left]からobj[right]までをソートします
    QSorter(TextField[] tf, int left, int right){
        obj=tf; this.left=left; this.right=right;
    }

    // support function: get integer value
    // Sorterとかぶっててかっこ悪いですね,修正点の指示に失敗しました
    private int val(TextField l){
        return Integer.parseInt(l.getText());
    }

    // support function: set integer value
    // Sorterとかぶっててかっこ悪いですね,修正点の指示に失敗しました
    private void set(TextField l, int v){
        //l.setBackground(Color.red);
        l.setText(v+"");
        //l.setBackground(Color.white);
    }

    // 見ていて分かりやすいように,分割中の値はクリアすることにしました
    private void clear(TextField l){
        l.setText("");
    }

    // Algorithm body, currently bubble sort
    public void run(){
        // ソート左端と右端のindexの大小が逆転してたら,この部分はソートが終わっているはず
        if(left>=right) return;

        // 分割するため,今ある値を tmpa[]に一時退避します
        int[] tmpa=new int[right-left+1];
        for(int i=0; i<tmpa.length; i++){
            tmpa[i]=val(obj[left+i]);
            clear(obj[left+i]);
        }

        int tmpl=0;             // tmplの指す相対位置に小さい値を左からつめていきます
        int tmpr=tmpa.length-1; // tmprの指す相対位置に大きい値を右からつめていきます
        int tmpc=tmpa[0];       // 中間値
        for(int i=1; i<tmpa.length; i++){
            if(tmpa[i]<tmpc){
                set(obj[left+tmpl], tmpa[i]); tmpl++;
            }else{
                set(obj[left+tmpr], tmpa[i]); tmpr--;
            }
            try{ Thread.currentThread().sleep(800); } catch(Exception e){}; // 見やすくするため
        }
        set(obj[left+tmpl], tmpc); // 左右に振り分け終わった後に中間値を置く位置がわかる

        new QSorter(obj, left, left+tmpl-1).run();  // 中間値は含まれないことに注意
        new QSorter(obj, left+tmpr+1, right).run();
    }
}

問題2

解答例のダウンロード

上記と異なる部分のみ 赤字. 要は上記とほとんど同じ.

class Sorter extends Thread{
private TextField[] obj; // reference to data

    Sorter(TextField[] l){ obj=l; }

    // support function: get integer value
    private int val(TextField l){
        return Integer.parseInt(l.getText());
    }

    // support function: set integer value
    private void set(TextField l, int v){
        //l.setBackground(Color.red);
        l.setText(v+"");
        //l.setBackground(Color.white);
    }

    // Bootstrap for Sort Engine
    public void run(){
        new QSorter(obj, 0, obj.length-1).start();
    }
}

class QSorter extends Thread{
private TextField[] obj; // reference to data
private int left;
private int right;

    QSorter(TextField[] tf, int left, int right){
        obj=tf; this.left=left; this.right=right;
    }

    // support function: get integer value
    private int val(TextField l){
        return Integer.parseInt(l.getText());
    }

    // support function: set integer value
    private void set(TextField l, int v){
        //l.setBackground(Color.red);
        l.setText(v+"");
        //l.setBackground(Color.white);
    }

    private void clear(TextField l){
        l.setText("");
    }

    // Algorithm body, currently bubble sort
    public void run(){
        // this segment is already sorted. 
        if(left>=right) return;

        int[] tmpa=new int[right-left+1];
        // save original values in obj[left] to obj[right];
        for(int i=0; i<tmpa.length; i++){
            tmpa[i]=val(obj[left+i]);
            clear(obj[left+i]);
        }

        int tmpl=0;
        int tmpr=tmpa.length-1;
        int tmpc=tmpa[0]; // assume center value
        for(int i=1; i<tmpa.length; i++){
            if(tmpa[i]<tmpc){
                set(obj[left+tmpl], tmpa[i]); tmpl++;
            }else{
                set(obj[left+tmpr], tmpa[i]); tmpr--;
            }
            try{ Thread.currentThread().sleep(800); } catch(Exception e){};
        }
        set(obj[left+tmpl], tmpc);

        new QSorter(obj, left, left+tmpl-1).start();
        new QSorter(obj, left+tmpr+1, right).start();
    }
}
修正制約を無視したちょいとはマシな解答例 (参考)

問題3


本ページトップ | 学科 | 問題 | 海谷ホームページ $Id: index.html,v 1.3 2003-04-27 21:58:10+09 kaiya Exp kaiya $