实例038 使用冒泡排序法对数组排序

实例038 使用冒泡排序法对数组排序

实例说明

本实例演示如何使用冒泡排序法对一维数组进行排序。运行本实例,首先单击“生成随机数组”按钮,生成一个随机数组,并显示在上方的文本域控件中;然后单击“排序”按钮,使用冒泡排序法对生成的一维数组进行排序,并将排序过程中一维数组的变化显示在下方的文本域控件中。实例的运行效果如图59所示。

实现过程

(3)编写“生成随机数组”按钮的事件处理方法,在该方法中创建Randon随机数对象,初始化数组元素值时,通过该对象为每个数组元素生成随机数。关键代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
JButton randomArrayButton = new JButton("生成随机数组");
randomArrayButton.setFont(new Font("宋体", Font.PLAIN, 14));
randomArrayButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
// 清空输入框
textField.setText("");
int[] array = new int[10];
int randomInt;
String arrayStr = "";
Random random = new Random();
for (int i = 0; i < array.length; i++)
{
randomInt = random.nextInt(50);
array[i] = randomInt;
if (i < array.length - 1)
{
arrayStr += array[i] + ",";
} else
{
arrayStr += array[i] + "";
}
}
textField.setText(arrayStr);
// System.out.println(arrayStr);
}
});

(4)编写“排序”按钮的事件处理方法,在该方法中使用排序算法对生成的随机数组进行排序,然后把排序后的数组元素显示到文本域控件中。关键代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
JButton bubbleSortButton = new JButton("冒泡排序");
bubbleSortButton.setFont(new Font("宋体", Font.PLAIN, 14));
bubbleSortButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
textArea.setText("");
String arrayStr = textField.getText();
String[] arrayStrs = arrayStr.split(",");
int[] array = new int[arrayStrs.length];
for (int i = 0; i < array.length; i++)
{
array[i] = Integer.parseInt(arrayStrs[i]);
}
textArea.append("待排序的数组:");
printArray(array);
textArea.append("排序轮次\t排序结果\n");
bubbleSort(array);
}

private void printArray(int[] array)
{
for (int j = 0; j < array.length; j++)
{
if (j < array.length - 1)
{
textArea.append(array[j] + ",");
} else
{
textArea.append(array[j] + "");
}
}
textArea.append("\n");
}

private void bubbleSort(int[] array)
{
int temp;
// 每次能选出一个最大的元素到尾部
for (int i = 0; i < array.length; i++)
{
for (int j = 0; j < array.length - i - 1; j++)
{
// 如果前面的大于后面的
if (array[j] > array[j + 1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
// 打印这次排序的结果
printSortingSteps(array, i);
}
}

private void printSortingSteps(int[] array, int i)
{
textArea.append(i + 1 + "\t");
for (int j = 0; j < array.length; j++)
{
if (j == array.length - i - 1)
{
textArea.append("[");
}
if (j < array.length - 1)
{
textArea.append(array[j] + ",");
} else
{
textArea.append(array[j] + "");
}

}
textArea.append("]\n");
}
});

技术要点

在实现本实例时,主要用到了冒泡排序算法。冒泡排序的基本思想是
对比相邻的元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样数组元素就像气泡一样从底部上升到顶部。
冒泡算法在双层循环中实现,其中外层循环控制排序轮数,是要排序数组长度-1次。
而内层循环主要是用于对比临近元素的大小,以确定是否交换位置,对比和交换次数依排序轮数而减少。

例如一个拥有6个元素的数组,在排序过程中每一次循环的排序过程和结果如图5.10所
图片

第一轮外层循环时把最大的元素值63移动到了最后面(相应地比63小的元素向前移动,类似气泡上升),
第二轮外层循环不再对比最后一个元素值63,因为它已经确认为最大(不需要上升),应该放在最后,需要对比和移动的是其他剩余元素,这次将元素24移动到了63的前一个位置。
其他循环将依此类推,继续完成排序任务。

关键代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void bubbleSort(int[] array)
{
int temp;
// 每次能选出一个最大的元素到尾部
for (int i = 0; i < array.length; i++)
{
for (int j = 0; j < array.length - i - 1; j++)
{
// 如果前面的大于后面的
if (array[j] > array[j + 1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
// 打印这次排序的结果
printSortingSteps(array, i);
}
}

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
package com;

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import java.awt.Font;

public class BubbleSort extends JFrame
{
private static final long serialVersionUID = -3781524001636217405L;
private JPanel contentPane;
private JTextField textField;

/**
* Launch the application.
*/
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable() {
public void run()
{
try
{
BubbleSort frame = new BubbleSort();
frame.setVisible(true);
} catch (Exception e)
{
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/
public BubbleSort() {
setTitle("冒泡排序");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 350);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
GridBagLayout gbl_contentPane = new GridBagLayout();
gbl_contentPane.columnWeights = new double[]{1.0};
gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 1.0, 0.0};
contentPane.setLayout(gbl_contentPane);

textField = new JTextField();
textField.setFont(new Font("宋体", Font.PLAIN, 14));
GridBagConstraints gbc_textField = new GridBagConstraints();
gbc_textField.insets = new Insets(0, 0, 5, 0);
gbc_textField.fill = GridBagConstraints.HORIZONTAL;
gbc_textField.gridx = 0;
gbc_textField.gridy = 0;
contentPane.add(textField, gbc_textField);
textField.setColumns(10);

JButton randomArrayButton = new JButton("生成随机数组");
randomArrayButton.setFont(new Font("宋体", Font.PLAIN, 14));
randomArrayButton.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e)
{
// 清空输入框
textField.setText("");
int[] array = new int[10];
int randomInt;
String arrayStr = "";
Random random = new Random();
for (int i = 0; i < array.length; i++)
{
randomInt = random.nextInt(50);
array[i] = randomInt;
if (i < array.length - 1)
{
arrayStr += array[i] + ",";
} else
{
arrayStr += array[i] + "";
}
}
textField.setText(arrayStr);
// System.out.println(arrayStr);
}
});
GridBagConstraints gbc_randomArrayButton = new GridBagConstraints();
gbc_randomArrayButton.insets = new Insets(0, 0, 5, 0);
gbc_randomArrayButton.gridx = 0;
gbc_randomArrayButton.gridy = 1;
contentPane.add(randomArrayButton, gbc_randomArrayButton);

JScrollPane scrollPane = new JScrollPane();
GridBagConstraints gbc_scrollPane = new GridBagConstraints();
gbc_scrollPane.fill = GridBagConstraints.BOTH;
gbc_scrollPane.insets = new Insets(0, 0, 5, 0);
gbc_scrollPane.gridx = 0;
gbc_scrollPane.gridy = 2;
contentPane.add(scrollPane, gbc_scrollPane);

JTextArea textArea = new JTextArea();
textArea.setFont(new Font("宋体", Font.PLAIN, 14));
scrollPane.setViewportView(textArea);

JButton bubbleSortButton = new JButton("冒泡排序");
bubbleSortButton.setFont(new Font("宋体", Font.PLAIN, 14));
bubbleSortButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
textArea.setText("");
String arrayStr = textField.getText();
String[] arrayStrs = arrayStr.split(",");
int[] array = new int[arrayStrs.length];
for (int i = 0; i < array.length; i++)
{
array[i] = Integer.parseInt(arrayStrs[i]);
}
textArea.append("待排序的数组:");
printArray(array);
textArea.append("排序轮次\t排序结果\n");
bubbleSort(array);
}

private void printArray(int[] array)
{
for (int j = 0; j < array.length; j++)
{
if (j < array.length - 1)
{
textArea.append(array[j] + ",");
} else
{
textArea.append(array[j] + "");
}
}
textArea.append("\n");
}

private void bubbleSort(int[] array)
{
int temp;
// 每次能选出一个最大的元素到尾部
for (int i = 0; i < array.length; i++)
{
for (int j = 0; j < array.length - i - 1; j++)
{
// 如果前面的大于后面的
if (array[j] > array[j + 1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
// 打印这次排序的结果
printSortingSteps(array, i);
}
}

private void printSortingSteps(int[] array, int i)
{
textArea.append(i + 1 + "\t");
for (int j = 0; j < array.length; j++)
{
if (j == array.length - i - 1)
{
textArea.append("[");
}
if (j < array.length - 1)
{
textArea.append(array[j] + ",");
} else
{
textArea.append(array[j] + "");
}

}
textArea.append("]\n");
}
});
GridBagConstraints gbc_bubbleSortButton = new GridBagConstraints();
gbc_bubbleSortButton.gridx = 0;
gbc_bubbleSortButton.gridy = 3;
contentPane.add(bubbleSortButton, gbc_bubbleSortButton);
}

}