⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch6_e6_23.java

📁 《java语言与面向对象程序设计题解及实验指导》源代码
💻 JAVA
字号:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class ch6_e6_23 extends Applet implements ActionListener
{
    final String SORT_METHOD_NAME[] = {"冒泡排序","桶排序"};
    
    Label prompt = new Label("请输入欲排序的字符串(最多10个):");
    TextField input = new TextField(5);
    Button sortBubbleBtn = new Button(SORT_METHOD_NAME[0]);
    Button sortSelectBtn = new Button(SORT_METHOD_NAME[1]);

    String[] OrigArray = new String[10];  //保存排序前顺序的数组
    String[] DataArray = new String[10];  //保存待排序数据的数组
    int DataInputed = 0;                //已输入数据的统计
    String[][] SortPro = new String[11][10];  //保存排序过程的二维数组

    public void init()              //初始化
    {
        for(int i=0; i<10; i++)
        {
            DataArray[i] = " ";
            OrigArray[i] = " ";
            SortPro[10][i] = " ";
            for(int j=0; j<10; j++)
                SortPro[i][j] = " ";
        }
        
        add(prompt);
        add(input);
        add(sortBubbleBtn);         //将提示、输入区域、按钮加入Applet
        add(sortSelectBtn);

        input.setText("");
        input.addActionListener(this);
        sortBubbleBtn.addActionListener(this);
        sortSelectBtn.addActionListener(this);
    }
    
    public void paint(Graphics g)//打印排序全过程
    {
        for(int i=0;i<SortPro.length;i++)       //二维数组的行数
            for(int j=0;j<SortPro[i].length;j++)    //二维数组第i行中的数据个数
            {
                try{
                g.drawString(SortPro[i][j],10+80*j,40+20*i);
                }catch(NullPointerException npe)
                {
                    System.out.println(i + "," + j);
                }
            }
    }
    
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == input)//用户在input中输入并回车
        {   //记录数据
            DataArray[DataInputed] = input.getText();
            OrigArray[DataInputed] = DataArray[DataInputed];
            DataInputed++;
            if(DataInputed < 10)
            {
                prompt.setText("已输入" + DataInputed + "个字符串,请继续");
                input.setText("");      //准备输入下一个数据
            }
            else                         //已输入10个数据
            {
                prompt.setText("已输入10个字符串,不能再输入了");
                input.setVisible(false);        //隐藏其输入区域
            }
        }
        if(e.getSource() == sortBubbleBtn)      //用户单击按钮,启动排序过程
        {
            for(int i=0;i<DataArray.length;i++) //记录未排序的原始数据
                SortPro[0][i] = DataArray[i];
            BubbleSortProcedure();              //调用冒泡排序方法
            repaint();
            for(int i=0;i<DataArray.length;i++)
                DataArray[i] = OrigArray[i];    //恢复排序前的乱序
        } 
        if(e.getSource() == sortSelectBtn)
        {
            for(int i=0;i<DataArray.length;i++) //记录未排序的原始数据
                SortPro[0][i] = DataArray[i];
            BucketSortProcedure();              //调用桶排序方法
            repaint();        
            for(int i=0;i<DataArray.length;i++)
                DataArray[i] = OrigArray[i];    //恢复排序前的乱序
        }
    }
    
    void BubbleSortProcedure()    //冒泡排序方法
    {
        int pass,i,exchangeCnt;
        String temp = "";

        for(pass=0;pass<DataArray.length;pass++)        //扫描多次
        {
            exchangeCnt=0;//记录本轮两两交换的次数
            for(i=0;i<DataArray.length-pass-1;i++)      //一次扫描过程
            {                                   //每次扫描比较范围缩小一个
                if(DataArray[i].compareToIgnoreCase(DataArray[i+1]) > 0)     //一次两两比较交换过程
                {
                    temp = DataArray[i];
                    DataArray[i] = DataArray[i+1];
                    DataArray[i+1] = temp;
                    exchangeCnt++;
                }
            }
            for(i=0;i<DataArray.length;i++)
                SortPro[pass+1][i] = DataArray[i];    //记录本轮扫描后数据排列情况
            if(exchangeCnt == 0) //若一次也未交换,则说明已完全排好序,不必再循环
                return;
        }
    }
    
    void BucketSortProcedure()  //桶排序方法
    {
        //暂时将字符范围限定在128个ASCII码内,最后一列保存这一行的数据个数
        String bucket[][] = new String[128][DataInputed+1];
        int pass =0;//扫描轮数计数   
    
        for(int i=0; i<128; i++)
            for(int j=0; j<DataInputed; j++)
                bucket[i][j] = " ";

        int strLength=0, doo=0;
        StringBuffer sb;
        
        //补足参差的字符串,使大家长度相同
        for(int i=0; i<DataInputed; i++)        
            strLength = Math.max(strLength,DataArray[i].length());
        for(int i=0; i<DataInputed; i++)
            if(DataArray[i].length()<strLength)
            {
                sb = new StringBuffer(DataArray[i]);
                for(int j=0; j<strLength-DataArray[i].length(); j++)
                    sb.append((char)doo);
                DataArray[i] = sb.toString();
            }

        do
        {
            for(int i=0;i<128;i++)
            {
                bucket[i][DataInputed] = "0";
            }
            for(int i=0;i<DataInputed;i++)//分散扫描
            {
                int ch;
                if(DataArray[i].length()-1 >= pass)
                    ch = DataArray[i].charAt(DataArray[i].length()-1-pass);
                else
                    ch = 0;
                if(ch>=128 || ch<0)
                {
                    showStatus("输入的字符超出了处理范围,只能处理ASCII字符串。");
                    return;
                }
                //去除大小写的影响
                if(ch>='A' && ch<='Z')
                {
                    System.out.println(ch + "," + (char)ch);
                    ch += 'a' - 'A';
                    System.out.println(ch + "," + (char)ch);
                }
                int count = Integer.parseInt(bucket[ch][DataInputed]);
                bucket[ch][count++] = DataArray[i];
                bucket[ch][DataInputed] = Integer.toString(count);
            }
            int k=0;
            for(int i=0;i<128;i++)//集中扫描
                for(int j=0;j<Integer.parseInt(bucket[i][DataInputed]);j++)
                    DataArray[k++] = bucket[i][j];
            for(int i=0;i<DataArray.length;i++) //记录本轮选择后数据排列情况
                SortPro[pass][i] = DataArray[i];
            pass++;
        }while(Integer.parseInt(bucket[0][DataInputed]) != DataInputed);//一轮扫描

    }

}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -