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);//一轮扫描
}
}