1. 程式人生 > >希爾排序的動畫演示效果及程式碼實現

希爾排序的動畫演示效果及程式碼實現

希爾排序的做法是:對序列a[0,…n-1],第一步先取一個小於n的整數d[1]作為第一個增量(具體選取可以參考維基百科上對希爾排序步長的說明,把序列分為d[1]個組,即將所有距離為d1倍數序號的記錄放在同一個組中,在各組內進行直接插入排序;第二步取第二個增量d[2],d[2]小於d[1],重複上述分組和排序工具,依次類推,直至所取的增量d[i]=1,即所有記錄放在同一組,對整個數列進行直接插入排序。
示例如下:
這裡寫圖片描述

下面對希爾排序進行動態演示 :
這裡寫圖片描述
實現程式碼如下:

public class testdata {

    int[] data=new int[10];
    public
testdata(){ data[0]=10;data[1]=5;data[2]=9; data[3]=4;data[4]=2;data[5]=8; data[6]=3;data[7]=1;data[8]=6; data[9]=7; } public void setdata(int[] data){ this.data=data; } } public class test extends JFrame { int x_foot = 40, x = 30, y_foot = 30; int
x_start = 100, y_start = 600; testdata da = new testdata(); public void UI() { this.setSize(800, 800); this.setVisible(true); Color[] color = { Color.BLACK, Color.BLUE, Color.GREEN, Color.ORANGE, Color.RED, Color.YELLOW ,Color.CYAN,Color.MAGENTA,Color.pink,Color.GRAY}; Graphics g = this
.getGraphics(); this.addMouseListener(new MouseListener() { public void mouseClicked(MouseEvent e) { try { Thread.sleep(5000); } catch (InterruptedException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } g.drawLine(0, 600, 800, 600); for (int i = 0; i < da.data.length; i++) { g.setColor(color[i]);//y_start - y_foot * da.data[i] g.fillOval(x_start + x_foot * i, 200, x, y_foot * da.data[i]); } for (int gap = da.data.length / 2; gap > 0; gap /= 2) for (int i = gap; i < da.data.length; i++) for (int j = i - gap; j >= 0 && da.data[j] > da.data[j + gap]; j -= gap){ int temp=da.data[j]; da.data[j]=da.data[j+gap]; da.data[j+gap]=temp; Color co=color[j]; color[j]=color[j+gap]; color[j+gap]=co; try { Thread.sleep(500); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } g.setColor(Color.WHITE); g.fillRect(0, 0, 800, 800); g.setColor(Color.BLACK); g.drawLine(0, 600, 800, 600); for (int ii = 0; ii < da.data.length; ii++) { g.setColor(color[ii]); g.fillOval(x_start + x_foot * ii, 200, x, y_foot * da.data[ii]); } } } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }); } public static void main(String[] args) { test te = new test(); te.UI(); } }