为冒泡排序创建计数器

问题描述 投票:0回答:2

我正在尝试制作一个计数器,每次交换一个数字时都会计数。我认为我走在正确的轨道上,但我的计数器没有显示,但是,它编译并运行正常。此代码将所有数字从最小到最大排序,我需要计算它交换的次数。

它需要放在bubblesort()方法中。我相信你每次移动时都必须将swapItems添加到+1来计数。如果有人可以帮助我,我将非常感激。

在其左侧有“>”的代码是代码的计数器部分。

// Sorting Application

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Sort2 extends JFrame implements ActionListener{

   private TextField[] items = new TextField[6];
   private JButton btnSort, btnClear, btnReset;
   private TextField tmp;
   private Label status;

   private int pauseInterval = 100; // ms
    
   public static void main(String[] args) {
      new Sort2().setVisible(true);
   }
   
   public Sort2() {
      init();
   }

   public void init() {
      setTitle("Sorting Algorithms");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(440, 200);
      JPanel jp = new JPanel(new BorderLayout());
      jp.setPreferredSize(new Dimension(440, 200));
      jp.setBackground(Color.white);
      
      JPanel itemPanel = new JPanel();
      itemPanel.setBackground(Color.white);
      for (int i = 0; i < items.length; i++) {
         items[i] = new TextField(3); 
         items[i].setPreferredSize(new Dimension(30,40));
         itemPanel.add(items[i]);
      }
      initItems();
      itemPanel.add(new Label("Temp:"));
      tmp = new TextField(4);
      tmp.setPreferredSize(new Dimension(30,40));
      tmp.setEditable(false);
      itemPanel.add(tmp);
      itemPanel.add(new Label(""))
         .setPreferredSize(new Dimension(380, 65));
   
      JPanel buttonPanel = new JPanel();
      buttonPanel.setBackground(Color.white);
      btnSort = new JButton("Sort");
      btnReset = new JButton("Reset");
      btnClear = new JButton("Clear");
      btnSort.addActionListener(this);
      btnClear.addActionListener(this);
      btnReset.addActionListener(this);
      buttonPanel.add(btnSort); 
      buttonPanel.add(btnClear); 
      buttonPanel.add(btnReset);
      
      status = new Label("Wating ... ");
      status.setPreferredSize(new Dimension(380, 40));
      JPanel statusPanel = new JPanel();
      statusPanel.setBackground(Color.white);
      statusPanel.add(status, BorderLayout.SOUTH);
      
      jp.add(itemPanel, BorderLayout.NORTH);
      jp.add(buttonPanel, BorderLayout.CENTER);
      jp.add(statusPanel, BorderLayout.SOUTH);
      
      getContentPane().add(jp);
   }

   private void initItems() {
      for (int i = 0; i < items.length; i++) {
         items[i].setText((
            String.valueOf((int)(Math.random()*100))));
      }
   }

   private void pause(int ms) {
      try {
         Thread.sleep(ms);
      } 
      catch (InterruptedException e) {
         showStatus(e.toString());
      }
   }

   private void assign(TextField to, TextField from) {
      Color tobg = to.getBackground();
      to.setBackground(Color.green);
      pause(pauseInterval);
      to.setText(from.getText());
      pause(pauseInterval);
      to.setBackground(tobg);
   }

   private void swapItems(TextField t1, TextField t2) {
      assign(tmp,t1);
      assign(t1,t2);
      assign(t2,tmp);
   }
   
   private boolean greaterThan(TextField t1, TextField t2) {
      boolean greater;
      Color t1bg = t1.getBackground();
      Color t2bg = t2.getBackground(); 
      t1.setBackground(Color.cyan); 
      t2.setBackground(Color.cyan); 
      pause(pauseInterval);
      greater = Integer.parseInt(t1.getText()) < 
              Integer.parseInt(t2.getText());
      pause(pauseInterval);
      t1.setBackground(t1bg);
      t2.setBackground(t2bg);  
      return greater;
   }

>        private void bubbleSort() {
>         int currentCount = 0;
>           showStatus("Sorting ...");
>           boolean swap = true;
>           while (swap) {
>              swap=false;
>              for (int i = 0; i < items.length-1; i++) {
>                 if (greaterThan(items[i],items[i+1])) {
>                    swapItems(items[i],items[i+1]);
>                    swap=true;
>                    for (int step = 1; step <= items.length+1; step++) {
>                        currentCount = currentCount + 1;
>                    }
>                 }
>              } //for
>           } // while
>           showStatus("Sort complete" + " number of swaps = " + currentCount);
>        } // bubbleSort

   public void actionPerformed(ActionEvent e) {
      String command = e.getActionCommand();
      switch (command) {
         case "Clear":
            for (int i = 0; i < items.length; i++) {
               items[i].setText("");
            }
            break;
         case "Sort":
            bubbleSort();
            break;
         case "Reset":
            initItems();
            break;
         default:
            showStatus("Unrecognised button: " + e.toString());
      }
   }

   private void showStatus(String s) {
      status.setText(s);
   }
      
}
java sorting bubble-sort
2个回答
0
投票

请查找更新的计算交换的工作代码。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Counter extends JFrame implements ActionListener {

    private TextField[] items = new TextField[6];
    private JButton btnSort, btnClear, btnReset;
    private TextField tmp;
    private Label status;
    private JLabel cntLabel;

    private int pauseInterval = 100;

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI() {
        Counter f = new Counter();
        f.init();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

    public Counter() {
//      init();
    }

    public void init() {
        setTitle("Sorting Algorithms");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(440, 200);
        JPanel jp = new JPanel(new BorderLayout());
        jp.setPreferredSize(new Dimension(440, 200));
        jp.setBackground(Color.white);

        JPanel itemPanel = new JPanel(new FlowLayout());
        itemPanel.setBackground(Color.white);
        for (int i = 0; i < items.length; i++) {
            items[i] = new TextField(3);
            items[i].setPreferredSize(new Dimension(30, 40));
            itemPanel.add(items[i]);
        }

        initItems();

        itemPanel.add(new Label("Temp:"));
        tmp = new TextField(4);
        tmp.setPreferredSize(new Dimension(30, 40));
        tmp.setEditable(false);
        itemPanel.add(tmp);
        itemPanel.add(cntLabel).setPreferredSize(new Dimension(100, 65));


        JPanel buttonPanel = new JPanel();
        buttonPanel.setBackground(Color.white);
        btnSort = new JButton("Sort");
        btnReset = new JButton("Reset");
        btnClear = new JButton("Clear");
        btnSort.addActionListener(this);
        btnClear.addActionListener(this);
        btnReset.addActionListener(this);
        buttonPanel.add(btnSort);
        buttonPanel.add(btnClear);
        buttonPanel.add(btnReset);

        status = new Label("Wating ... ");
        status.setPreferredSize(new Dimension(380, 40));
        JPanel statusPanel = new JPanel();
        statusPanel.setBackground(Color.white);
        statusPanel.add(status, BorderLayout.SOUTH);

        jp.add(itemPanel, BorderLayout.NORTH);
        jp.add(buttonPanel, BorderLayout.CENTER);
        jp.add(statusPanel, BorderLayout.SOUTH);

        getContentPane().add(jp);
    }

    private void initItems() {
        for (int i = 0; i < items.length; i++) {
            items[i].setText((String.valueOf((int) (Math.random() * 100))));
        }
//      if(null!=swapLabel)
//          swapLabel.setText("");
        cntLabel = new JLabel("0");
    }

    private void pause(int ms) {
        try {
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            showStatus(e.toString());
        }
    }

    private void assign(TextField to, TextField from) {
        Color tobg = to.getBackground();
        to.setBackground(Color.green);
        pause(pauseInterval);
        to.setText(from.getText());
        pause(pauseInterval);
        to.setBackground(tobg);
    }

    private void swapItems(TextField t1, TextField t2) {
        assign(tmp, t1);
        assign(t1, t2);
        assign(t2, tmp);
    }

    private boolean greaterThan(TextField t1, TextField t2) {
        boolean greater;
        Color t1bg = t1.getBackground();
        Color t2bg = t2.getBackground();
        t1.setBackground(Color.cyan);
        t2.setBackground(Color.cyan);
        pause(pauseInterval);
        greater = Integer.parseInt(t1.getText()) < Integer.parseInt(t2.getText());
        pause(pauseInterval);
        t1.setBackground(t1bg);
        t2.setBackground(t2bg);
        return greater;
    }

    private void bubbleSort() {
        int currentCount = 0;
        int n = 0;
        showStatus("Sorting ...");
        boolean swap = true;
        while (swap) {
            swap = false;
            for (int i = 0; i < items.length - 1; i++) {
                if (greaterThan(items[i], items[i + 1])) {
                    swapItems(items[i], items[i + 1]);
                    swap = true;
                    currentCount++;
                }
            } // for
        } // while
        showStatus("Sort complete : Swap count = " + currentCount);
    } // bubbleSort

    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
        switch (command) {
        case "Clear":
            for (int i = 0; i < items.length; i++) {
                items[i].setText("");
            }
            cntLabel = new JLabel("0");
            break;
        case "Sort":
            bubbleSort();
            break;
        case "Reset":
            initItems();
            break;
        default:
            showStatus("Unrecognised button: " + e.toString());
        }
    }

    private void showStatus(String s) {
        status.setText(s);
    }

}

0
投票

如果我理解正确,我认为问题在于你有一个不必要的for循环(带有step变量的循环)。您需要做的就是删除该循环,只需改为:

currentCount += 1; 
// Alternatively, you could also do 'currentCount = currentCount + 1;' or 'currentCount++;'

所以基本上,你的if方法中的bubbleSort()语句看起来应该是这样的:

if (greaterThan(items[i], items[i + 1])) {
    swapItems(items[i], items[i + 1]);
    swap = true;
    currentCount += 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.