实例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); } });
|
(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;
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(); } } }); }
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); } }); 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); }
}
|