微剋多資訊

 找回密碼
 註冊

Login

Login

搜索

該用戶從未簽到

發表於 2013-5-14 11:10 | 顯示全部樓層 |閱讀模式
本帖最後由 fs910175 於 2013-5-15 17:04 編輯

只有C語言的版...不知道能不能放這...

話不多說...看code:

MAIN
[code=java]import javax.swing.JFrame;

@SuppressWarnings("serial")
public class ALGHW1 extends JFrame
{
  public static void main(String[] args)
  {
    ALG alg = new ALG();
    alg.setDefaultCloseOperation(EXIT_ON_CLOSE);
  }

}
[/code]

SUB
[code=java]
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
//Frame structure
public class ALG extends JFrame
{
  //UI config
  private JFrame mainframe;
  private DPanel Dpanel;
    private JButton RunAlgBtn;
    private JButton RandDataBtn;
  private JPanel actionpanel;
  private int counter = 0;
  
  //Data STR
  ArrayList<Double> DataArray=new ArrayList<Double>(100);
  
  //Drawing Agent
  public BufferedImage bufferedimage;
public Point[] points = new Point[ 100 ];

  //FrameworkUI
  public ALG()
  {
    Sorter sorter = new Sorter(DataArray, Dpanel);
      final Thread sorterThread = new Thread(sorter);
    //drawing agent
    bufferedimage = new BufferedImage(1500, 1500,
        BufferedImage.TYPE_INT_ARGB);
   
    //Frame
    mainframe = new JFrame("ALGHW1");
    mainframe.setLayout(new BorderLayout());
   
    //Panel
    Dpanel = new DPanel();
    Dpanel.setLayout(new GridLayout(2,9,2,2));
    Dpanel.setBackground( Color.WHITE );
   
    //add panel to frame
    mainframe.add(Dpanel, BorderLayout.CENTER);
   
    //ActPanel with BtnACT
    actionpanel = new JPanel();
      RunAlgBtn = new JButton("停止");
        RunAlgBtn.addActionListener
        (
            new ActionListener()
          {
            @SuppressWarnings("deprecation")
            public void actionPerformed(ActionEvent event)
            {               
              if (counter == 0){
              RunAlgBtn.setText("繼續");
              sorterThread.suspend();
              counter+=1;
              }
              else if(counter == 1)
              {
                RunAlgBtn.setText("停止");
                sorterThread.resume();
                counter-=1;
              }            
            }
          }
        );
      RandDataBtn = new JButton("重新亂數");
        RandDataBtn.addActionListener
        (
            new ActionListener()
          {
              public void actionPerformed(ActionEvent event)
              {                  
                Collections.shuffle(DataArray);  
               
                sorterThread.suspend();
                RunAlgBtn.setText("繼續");
                counter=1;
                Dpanel.repaint();
              }
          }
        );
    //addBtn
    actionpanel.add(RandDataBtn);
    actionpanel.add(RunAlgBtn);
   
    //add panel to frame
    mainframe.add(actionpanel, BorderLayout.SOUTH);
   
    //Set Frame
    mainframe.setSize(310,370);
    mainframe.setVisible(true);
    mainframe.setResizable(false);
    mainframe.setDefaultCloseOperation(EXIT_ON_CLOSE);
   
    //Init Arry for further use
    for(int i=0;i<=99;i++)
    {
      DataArray.add((double) (i+1));
    }
    //Rand Array   
    Collections.shuffle(DataArray);
        sorterThread.start();
  }

  //drawing agent
  public class DPanel extends JPanel
  {
      private Double marked1;
      private Double marked2;
      private ArrayList<Double> DataArray;     
      DPanel()
       {
      //bufferedimage = new BufferedImage(1500, 1500,BufferedImage.TYPE_INT_ARGB);
      }
        public void paintComponent( Graphics g )
         {
          super.paintComponent(g);
          if (DataArray == null)
          return;
          Graphics2D g2 = (Graphics2D) g;
          for (int i = 0; i <  DataArray.size(); i++) {  
            Double v = DataArray.get(i);           
            if (v == marked1 || v == marked2)
            g2.fillRoundRect(i*3, (int) (300-v*3),5, 5,10,10);
            else
            g2.drawRoundRect(i*3, (int) (300-v*3),5, 5,10,10);                     
          }         
        }
        @SuppressWarnings("unchecked")
      public synchronized void setValues(ArrayList<Double> DataArray, Double marked1, Double marked2) {
            this.DataArray = DataArray;
            this.marked1 = marked1;
            this.marked2 = marked2;
            repaint();
          }      
      }
  class Sorter implements Runnable {   
      private DPanel DPanel;      
      public Sorter(ArrayList<Double> DataArray, DPanel DPanel) {      
        this.DPanel = DPanel;
      }
      public void run() {
        Comparator<Double> comp = new Comparator<Double>() {
          public int compare(Double d1, Double d2) {
            try {
                Thread.sleep(100);
            } catch (Exception exception) {
              System.out.println(exception);
            }
            Dpanel.setValues(DataArray, d1, d2);
            
            return d1.compareTo(d2);
          }
        };
        Collections.sort(DataArray, comp);
        Dpanel.setValues(DataArray, null, null);
      }
    }
}
[/code]

動畫顯示出來只會看到點閃來閃去的...可是沒有在進行排序
想了很久...有點鬼打牆
放上來求助


註:
目前sorting演算法是Quick Sort
最後完成的時候要在|d1-d2|<=8之後使用Insertion Sort來增進速度


該用戶從未簽到

發表於 2013-5-14 13:31 | 顯示全部樓層
剛剛看了一下

只知道你的 DataArray 是空的

排序那邊是真的有再跑,只是沒東西給他跑 XD
回覆

使用道具 舉報

該用戶從未簽到

 樓主| 發表於 2013-5-15 01:48 | 顯示全部樓層
爆肝coding中...
回覆

使用道具 舉報

該用戶從未簽到

 樓主| 發表於 2013-5-15 05:22 | 顯示全部樓層
  1. import java.awt.BorderLayout;
  2. import java.awt.Color;
  3. import java.awt.Graphics;
  4. import java.awt.Graphics2D;
  5. import java.awt.GridLayout;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import java.util.ArrayList;
  9. import java.util.Collections;
  10. import javax.swing.JButton;
  11. import javax.swing.JFrame;
  12. import javax.swing.JLabel;
  13. import javax.swing.JPanel;
  14. import javax.swing.JTextField;

  15. @SuppressWarnings("serial")
  16. //Frame structure
  17. public class ALGHW1 extends JFrame
  18. {
  19.         //UI config
  20.         private JFrame mainframe;
  21.         private DPanel Dpanel;
  22.                 private JButton RunAlgBtn;
  23.                 private JButton RandDataBtn;
  24.         private JPanel actionpanel;
  25.                 private JTextField JTX;
  26.                 private JLabel TXB;
  27.        
  28.         //Data STR
  29.         ArrayList<Integer> DataArray=new ArrayList<Integer>(100);
  30.        
  31.         public boolean Run = false;
  32.         public boolean Done = false;
  33.         public int time = 100;
  34.        
  35.         //FrameworkUI
  36.         public ALGHW1()
  37.         {
  38.                 //Init Arry for further use
  39.                                 for(int i=0;i<=99;i++)
  40.                                 {
  41.                                         DataArray.add(i+1);
  42.                                 }
  43.                                 //Rand Array
  44.                                
  45.                                 Collections.shuffle(DataArray);
  46.                                  Arraysort arraysort = new Arraysort(DataArray,Dpanel);
  47.                                 Thread arraysorthread = new Thread(arraysort);
  48.                        
  49.                 //Frame
  50.                 mainframe = new JFrame("ALGHW1");
  51.                 mainframe.setLayout(new BorderLayout());
  52.                
  53.                 //Panel
  54.                 Dpanel = new DPanel();
  55.                 Dpanel.setLayout(new GridLayout(2,9,2,2));
  56.                 Dpanel.setBackground( Color.BLACK );
  57.                
  58.                 //add panel to frame
  59.                 mainframe.add(Dpanel, BorderLayout.CENTER);
  60.        
  61.                 //ActPanel with BtnACT
  62.                 actionpanel = new JPanel();
  63.                         RunAlgBtn = new JButton("開始");
  64.                                 RunAlgBtn.addActionListener
  65.                                 (
  66.                                                 new ActionListener()
  67.                                         {
  68.                                                 @SuppressWarnings("deprecation")
  69.                                                 public void actionPerformed(ActionEvent event)
  70.                                                 {  
  71.                                                         if(Done == false){
  72.                                                                 time = Integer.parseInt(JTX.getText());
  73.                                                                 Arraysort arraysort = new Arraysort(DataArray,Dpanel);
  74.                                                                 Thread arraysorthread = new Thread(arraysort);
  75.                                                                 arraysorthread.start();
  76.                                                                 RunAlgBtn.setVisible(false);
  77.                                                                 Run = true;
  78.                                                         }       
  79.                                                 }
  80.                                         }
  81.                                 );
  82.                         RandDataBtn = new JButton("重新亂數");
  83.                                 RandDataBtn.addActionListener
  84.                                 (
  85.                                                 new ActionListener()
  86.                                         {
  87.                                                         @SuppressWarnings("deprecation")
  88.                                                         public void actionPerformed(ActionEvent event)
  89.                                                         {                                         
  90.                                                                         if(Run)
  91.                                                                         {
  92.                                                                                 RunAlgBtn.setVisible(false);
  93.                                                                         }
  94.                                                                         else
  95.                                                                         {                                                       

  96.                                                        
  97.                                                                                 Collections.shuffle(DataArray);
  98.                                                                                 RunAlgBtn.setVisible(true);
  99.                                                                                 Done = false;
  100.                                                                                 Dpanel.repaint();
  101.                                                                         }
  102.                                                         }
  103.                                         }
  104.                                 );
  105.                                
  106.                                 JTX = new JTextField(3);
  107.                                 JTX.setText(String.valueOf(time));
  108.                                 TXB = new JLabel("命令時間");

  109.                 //addBtn
  110.                 actionpanel.add(RandDataBtn);
  111.                 actionpanel.add(RunAlgBtn);
  112.                 actionpanel.add(TXB);
  113.                 actionpanel.add(JTX);

  114.                 //add panel to frame
  115.                 mainframe.add(actionpanel, BorderLayout.SOUTH);
  116.                
  117.                 //Set Frame
  118.                 mainframe.setSize(600,600);
  119.                 mainframe.setVisible(true);
  120.                 mainframe.setResizable(true);
  121.                 mainframe.setDefaultCloseOperation(EXIT_ON_CLOSE);
  122.        
  123.         }
  124.         public static void main(String[] args)
  125.         {
  126.                 ALGHW1 alg = new ALGHW1();
  127.                 alg.setDefaultCloseOperation(EXIT_ON_CLOSE);
  128.         }
  129.         public class DPanel extends JPanel
  130.         {       
  131.                         private int marked1;
  132.                         private int marked2;
  133.                        
  134.                           public void paintComponent( Graphics g )
  135.                            {
  136.                                   super.paintComponent(g);       
  137.                                   int c = Dpanel.getWidth()/80;
  138.                                         int d = Dpanel.getHeight()/80;
  139.                                         int e = Dpanel.getWidth();
  140.                                         int f = Dpanel.getHeight();
  141.                                   if(DataArray.isEmpty())
  142.                                           return;
  143.                                   Graphics2D g2 = (Graphics2D) g;
  144.                                         for (int i = 0; i < DataArray.size(); i++)
  145.                                         {               
  146.                                                 int v =  DataArray.get(i);
  147.                                                 int a = i*Dpanel.getWidth()/100;
  148.                                                 int b = (Dpanel.getHeight()-v*Dpanel.getHeight()/100);
  149.                                                
  150.                                                
  151.                                                 if(i == marked1)
  152.                                                 {
  153.                                                         g2.setColor(Color.RED);
  154.                                                         g2.fillRoundRect(a, b,c,d,e,f);
  155.                                                 }
  156.                                                 else if(i == marked2)
  157.                                                 {
  158.                                                         g2.setColor(Color.GREEN);
  159.                                                         g2.fillRoundRect(a, b,c,d,e,f);
  160.                                                 }
  161.                                                 else
  162.                                                 {
  163.                                                         g2.setColor(Color.WHITE);
  164.                                                         g2.fillRoundRect(a, b,c,d,e,f);
  165.                                                 }                               
  166.                                         }
  167.                            }
  168.                        
  169.                         public synchronized void setMARK(int marked1, int marked2)
  170.                           {
  171.                                 this.marked1 = marked1;
  172.                                 this.marked2 = marked2;
  173.                           }                  
  174.         }
  175.        
  176.        
  177.         class Arraysort implements Runnable
  178.         {
  179.                 private ArrayList<Integer> dataArray;
  180.                 public Arraysort(ArrayList<Integer> dataArray, DPanel dpanel)
  181.                 {
  182.                 // TODO Auto-generated method stub
  183.                         this.dataArray = DataArray;
  184.                     
  185.                 }
  186.                  public void run() //CALL fquickSort
  187.                  {                                   //CALL fquickSort
  188.                          fquickSort(); //CALL fquickSort
  189.                  }                                   //CALL fquickSort
  190.                  
  191.                   public void fquickSort()                                         //CALL recQuickSort
  192.                   {                                                                                         //CALL recQuickSort
  193.                     recQuickSort(0, dataArray.size() - 1);  //CALL recQuickSort
  194.                   }                                                                                        //CALL recQuickSort
  195.                   
  196.                   public void recQuickSort(int left, int right) {
  197.                     int size = right - left + 1;   
  198.                     if (size < 8 && size>0)
  199.                     {
  200.                             // insertion sort if small
  201.                             insertionSort(left, right);//插序//插序//插序//插序//插序//插序//插序//插序//插序//插序//插序
  202.                     }             
  203.                     else if(size>=8) // quicksort if large
  204.                     {
  205.                       long median = medianOf3(left, right); //算中間//算中間//算中間//算中間//算中間//算中間//算中間//算中間

  206. //算中間
  207.                       int partition = partitionIt(left, right, median);//中間分分樂//中間分分樂//中間分分樂//中間分分樂//中

  208. 間分分樂//中間分分樂//中間分分樂//中間分分樂
  209.                       recQuickSort(left, partition - 1);        //遞回1
  210.                       recQuickSort(partition + 1, right);        //遞回2
  211.                     }
  212.                   }       
  213.                   
  214.                   public long medianOf3(int left, int right) //算中間//算中間//算中間//算中間//算中間//算中間//算中間//算中

  215. 間//算中間
  216.                   {
  217.                     int center = (left + right) / 2;
  218.                     // order left & center
  219.                     if (dataArray.get(left) > dataArray.get(center))
  220.                     {
  221.                              swap(left, center);
  222.                     }                     
  223.                     // order left & right
  224.                     if (dataArray.get(left) > dataArray.get(right))
  225.                     {
  226.                             swap(left, right);
  227.                     }             
  228.                     // order center & right
  229.                     if (dataArray.get(center) > dataArray.get(right))
  230.                     {
  231.                             swap(center, right);
  232.                     }                     
  233.                             swap(center, right - 1);
  234.                             return dataArray.get(right - 1);
  235.                   }//算中間//算中間//算中間//算中間//算中間//算中間//算中間//算中間//算中間//算中間//算中間//算中間//算中

  236. 間//算中間//算中間//算中間
  237.                   
  238.                   public void swap(int d1, int d2)//交換廚 //交換廚 //交換廚 //交換廚 //交換廚 //交換廚 //交換廚 //交換廚 //

  239. 交換廚 //交換廚 //交換廚 //交換廚
  240.                   {
  241.                           Dpanel.setMARK(d1,d2);
  242.                     long temp = dataArray.get(d1);
  243.                     try {
  244.                                 Thread.sleep(time);
  245.                                 dataArray.set(d1,dataArray.get(d2));
  246.                                 dataArray.set(d2,(int) temp);
  247.                         } catch (InterruptedException e) {
  248.                                 // TODO Auto-generated catch block
  249.                                 e.printStackTrace();
  250.                         }
  251.                     Dpanel.repaint();                        
  252.                   }//交換廚 //交換廚 //交換廚 //交換廚 //交換廚 //交換廚 //交換廚 //交換廚 //交換廚 //交換廚 //交換廚 //交換

  253. 廚 //交換廚 //交換廚 //交換廚 //交換廚 //交換廚
  254.                   public int partitionIt(int left, int right, long pivot) //中間分分樂//中間分分樂//中間分分樂//中間分分樂//

  255. 中間分分樂//中間分分樂//中間分分樂//中間分分樂
  256.                   {
  257.                     int leftPtr = left; // right of first elem
  258.                     int rightPtr = right - 1; // left of pivot
  259.                     while (true)
  260.                     {
  261.                       //find bigger
  262.                       while (dataArray.get(++leftPtr) < pivot)
  263.                         ;
  264.                       //find smaller
  265.                       while (dataArray.get(--rightPtr) > pivot)
  266.                         ;
  267.                       if (leftPtr >= rightPtr) // if pointers cross, partition done
  268.                         break;
  269.                       else
  270.                         swap(leftPtr, rightPtr);
  271.                     }
  272.                     swap(leftPtr, right - 1); // restore pivot
  273.                     return leftPtr; // return pivot location
  274.                   }
  275.                   //中間分分樂//中間分分樂//中間分分樂//中間分分樂//中間分分樂//中間分分樂//中間分分樂//中間分分樂//中間分分

  276. 樂//中間分分樂//中間分分樂//中間分分樂//中間分分樂//中間分分樂//中間分分樂
  277.                   
  278.                   public void insertionSort(int left, int right) //插序//插序//插序//插序//插序//插序//插序//插序//插序
  279.                   {
  280.                     int in, out;
  281.                     //  sorted on left of out
  282.                     for (out = left + 1; out <= right; out++)
  283.                     {
  284.                       long temp = dataArray.get(out); // remove marked item
  285.                       in = out; // start shifts at out
  286.                       // until one is smaller,
  287.                       while (in > left && dataArray.get(in - 1) >= temp)
  288.                       {
  289.                               dataArray.set(in,dataArray.get(in-1)); // shift item to right
  290.                         --in; // go left one position
  291.                       }
  292.                       Dpanel.setMARK(in,out);
  293.                      if(out >= 90)
  294.                      {
  295.                              RunAlgBtn.setVisible(true);
  296.                              Run = false;
  297.                              Done = true;
  298.                      }
  299.                       dataArray.set(in,(int) temp);
  300.                      
  301.                     }
  302.                   }        //插序//插序//插序//插序//插序//插序//插序//插序//插序//插序//插序//插序//插序//插序//插序//插序//插

  303. 序//插序//插序
  304.         }
  305.        
  306.         //drawing agent

  307. }
複製代碼
回覆

使用道具 舉報

該用戶從未簽到

 樓主| 發表於 2013-5-15 05:22 | 顯示全部樓層
寫出來了~歡迎測試喔~
回覆

使用道具 舉報

該用戶從未簽到

發表於 2013-5-15 08:22 | 顯示全部樓層
clement10601 發表於 2013-5-15 05:22
寫出來了~歡迎測試喔~

那一樓的程式碼有很多怪東西亂入了.....
懶得自己改了 弄好在複製來測試@@
回覆

使用道具 舉報

該用戶從未簽到

 樓主| 發表於 2013-5-15 11:42 | 顯示全部樓層
ad6543210 發表於 2013-5-15 08:22
那一樓的程式碼有很多怪東西亂入了.....
懶得自己改了 弄好在複製來測試@@
...

一樓的程式碼就放生好了

我那時候大概是頭腦不清楚......科

回覆

使用道具 舉報

該用戶從未簽到

 樓主| 發表於 2013-5-15 11:46 | 顯示全部樓層
本帖最後由 clement10601 於 2013-5-15 11:47 編輯

放youtube上了



其實還是有BUG...就是到最後元素小於8個的時候改用insertionsort
會變成是瞬間完成...而沒有動畫效果
原因在於最後一個for迴圈中無法加入Thread.sleep()
我再想可能要用Thread.join/Thread.lock等...來完成

回覆

使用道具 舉報

該用戶從未簽到

 樓主| 發表於 2013-5-15 17:28 | 顯示全部樓層
新版~更新BUG


回覆

使用道具 舉報

您需要登入後才可以回帖 登入 | 註冊

本版積分規則

小黑屋|Archiver|微剋多資訊(MicroDuo)

GMT+8, 2016-12-6 23:56

Discuz! X

© 2009-2016 Microduo

快速回覆 返回頂部 返回列表