解答例 | 海谷ホームページ | 問題へ戻る | 学科 |
問題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 $ |