heapsortapp.java
来自「本程序提供了各种排序算法及演示,由java实现,可以清楚看到各算法的流程演示.」· Java 代码 · 共 570 行 · 第 1/2 页
JAVA
570 行
// HeapSortApp.javaimport java.awt.*;public class HeapSortApp extends SortApp{ private int heapSize, line1, line2, line3; public HeapSortApp(SortStarter ss, boolean runsFromApplet, String _arrayString, CompareTable table, int[] array) { super(ss, runsFromApplet, SortStarter.HEAP, "Heapsort", table, array != null); arrayString = _arrayString; if (isSpecial) { A = array; AToCopy(); copyToRandomCopy(); } algCode = new String[23]; algCode[0] = "HEAPSORT (A)"; algCode[1] = "1. BUILD-HEAP (A)"; algCode[2] = "2. for k <- length[A] - 1 downto 1"; algCode[3] = "3. do exchange A[0] <-> A[k]"; algCode[4] = "4. heap-size[A] <- heap-size[A] - 1"; algCode[5] = "5. HEAPIFY (A, 0)"; algCode[6] = "\n"; algCode[7] = "BUILD-HEAP (A)"; algCode[8] = "1. heap-size[A] <- length[A]"; algCode[9] = "2. for j <- (length[A] div 2) - 1 downto 0"; algCode[10] = "3. do HEAPIFY (A, j)"; algCode[11] = "\n"; algCode[12] = "HEAPIFY (A, i)"; algCode[13] = " 1. l = 2 * i + 1"; algCode[14] = " 2. r = 2 * i + 2"; algCode[15] = " 3. if l < heap-size[A] and A[l] > A[i]"; algCode[16] = " 4. then max <- l"; algCode[17] = " 5. else max <- i"; algCode[18] = " 6. if r < heap-size[A] and A[r] > A[max]"; algCode[19] = " 7. then max <- r"; algCode[20] = " 8. if max <> i"; algCode[21] = " 9. then exchange A[i] <-> A[max]"; algCode[22] = "10. HEAPIFY (A, max)"; program = new ProgramCanvas(algCode); Panel programPanel = new Panel(); programPanel.setLayout(new GridBagLayout()); gbc.insets = new Insets(0, 0, 0, 0); gbc.anchor = GridBagConstraints.CENTER; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 0; gbc.weighty = 100; gbc.fill = GridBagConstraints.BOTH; programPanel.add(new Canvas(), gbc); gbc.weighty = 0; programPanel.add(program, gbc); gbc.weighty = 100; programPanel.add(new Canvas(), gbc); numOfVars = 7; labels = new Label[numOfVars]; labels[0] = new Label("heap-size[A]: ", Label.RIGHT); labels[1] = new Label("l: ", Label.RIGHT); labels[2] = new Label("k: ", Label.RIGHT); labels[3] = new Label("r: ", Label.RIGHT); labels[4] = new Label("j: ", Label.RIGHT); labels[5] = new Label("i: ", Label.RIGHT); labels[6] = new Label("max: ", Label.RIGHT); variables = new TextField[numOfVars]; for(int i = 0; i < numOfVars; i++) { variables[i] = new TextField(2); variables[i].setEditable(false); variables[i].setBackground(Color.white); } arrayPointers = new String[4]; arrayPointers[0] = "k"; arrayPointers[1] = "i"; arrayPointers[2] = "l"; arrayPointers[3] = "r"; arrayPointersPos = new int[4]; Panel varPanel0 = new Panel(); varPanel0.setLayout(new GridLayout(2, 1)); varPanel0.add(labels[0]); varPanel0.add(labels[1]); Panel varPanel1 = new Panel(); varPanel1.setLayout(new GridLayout(2, 1)); varPanel1.add(variables[0]); varPanel1.add(variables[1]); Panel varPanel2 = new Panel(); varPanel2.setLayout(new GridLayout(2, 2)); for(int i = 2; i < 4; i++) { varPanel2.add(labels[i]); varPanel2.add(variables[i]); } Panel varPanel3 = new Panel(); varPanel3.setLayout(new GridLayout(2, 2)); for(int i = 4; i < 6; i++) { varPanel3.add(labels[i]); varPanel3.add(variables[i]); } Panel varPanel4 = new Panel(); varPanel4.setLayout(new GridLayout(1, 2)); varPanel4.add(labels[6]); varPanel4.add(variables[6]); Panel variablesPanel = new Panel(); variablesPanel.setLayout(new FlowLayout()); variablesPanel.add(varPanel0); variablesPanel.add(varPanel1); variablesPanel.add(varPanel2); variablesPanel.add(varPanel3); variablesPanel.add(varPanel4); Panel arrayVarPanel = new Panel(); arrayVarPanel.setLayout(new GridBagLayout()); gbc.insets = new Insets(0, 5, 0, 5); gbc.anchor = GridBagConstraints.CENTER; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 100; gbc.weighty = 100; gbc.fill = GridBagConstraints.BOTH; arrayVarPanel.add(arrayPane, gbc); gbc.insets = new Insets(0, 0, 0, 0); gbc.anchor = GridBagConstraints.CENTER; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 0; gbc.weighty = 0; gbc.fill = GridBagConstraints.NONE; arrayVarPanel.add(variablesPanel, gbc); setLayout(new GridBagLayout()); gbc.insets = new Insets(0, 0, 0, 0); gbc.anchor = GridBagConstraints.NORTH; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 100; gbc.fill = GridBagConstraints.HORIZONTAL; add(topPanel, gbc); gbc.anchor = GridBagConstraints.WEST; gbc.gridwidth = 1; gbc.weightx = 0; gbc.fill = GridBagConstraints.BOTH; add(new Box(inputPanel, "Array Data", Box.LEFT), gbc); gbc.anchor = GridBagConstraints.EAST; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 100; gbc.fill = GridBagConstraints.BOTH; add(new Box(speedPanel, "Speed Controls", Box.LEFT), gbc); gbc.anchor = GridBagConstraints.CENTER; gbc.gridwidth = 1; gbc.weightx = 0; gbc.weighty = 100; gbc.fill = GridBagConstraints.BOTH; add(new Box(programPanel, algorithmName + " Algorithm", Box.LEFT), gbc); Panel rightPanel = new Panel(); rightPanel.setLayout(new GridBagLayout()); gbc.anchor = GridBagConstraints.CENTER; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 100; gbc.weighty = 100; gbc.fill = GridBagConstraints.BOTH; rightPanel.add(new Box(arrayVarPanel, "Array and Pointers", Box.LEFT), gbc); gbc.anchor = GridBagConstraints.CENTER; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 100; gbc.weighty = 0; gbc.fill = GridBagConstraints.BOTH; rightPanel.add(new Box(statsPanel, "Algorithm Statistics", Box.LEFT), gbc); gbc.anchor = GridBagConstraints.EAST; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 100; gbc.fill = GridBagConstraints.BOTH; rightPanel.add(new Box(buttonPanel, "User Options", Box.LEFT), gbc); gbc.anchor = GridBagConstraints.CENTER; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 100; gbc.weighty = 100; gbc.fill = GridBagConstraints.BOTH; add(rightPanel, gbc); validate(); pack(); setVisible(true); if (arrayString != null) arrayLine.setText(arrayString); } private void clearHeapify() { arrayPointers[1] = "i"; arrayPointers[2] = "l"; arrayPointers[3] = "r"; for(int x = 1; x < arrayPointersPos.length; x++) arrayPointersPos[x] = -2; variables[1].setText(""); variables[3].setText(""); variables[5].setText(""); variables[6].setText(""); } private void heapsort(Thread thisThread) { if (runner == thisThread) { line1 = 1; program.selectLines(line1, line2, line3); pause(); } if (runner == thisThread) buildHeap(thisThread); for(int k = A.length - 1; k > 0; k--) { if (runner != thisThread) break; if (runner == thisThread) { line1 = 2; program.selectLines(line1, line2, line3); variables[2].setText(Integer.toString(k)); arrayPointersPos[0] = k; arrayCanvas.repaint(); pause(); } if (runner == thisThread) { line1 = 3; program.selectLines(line1, line2, line3); exchangeCt++; exchangeField.setText(Integer.toString(exchangeCt)); arrayCanvas.setStatus(0, SWAPPING); arrayCanvas.setStatus(k, SWAPPING); arrayCanvas.repaint(); pause(); } if (runner == thisThread) { int temp = A[0]; A[0] = A[k]; A[k] = temp; arrayCanvas.repaint(); pause(); } if (runner == thisThread) { arrayCanvas.setStatus(0, UNSORTED); arrayCanvas.setStatus(k, DONE); arrayCanvas.repaint(); line1 = 4; program.selectLines(line1, line2, line3); heapSize--; variables[0].setText(Integer.toString(heapSize)); pause(); } if (runner == thisThread) { line1 = 5; program.selectLines(line1, line2, line3); pause(); } if (runner == thisThread) heapify(0, thisThread); } if (runner == thisThread) arrayCanvas.setStatus(0, DONE); } private void buildHeap(Thread thisThread) { if (runner == thisThread)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?