希爾排序的動畫演示效果及程式碼實現
阿新 • • 發佈:2019-01-27
希爾排序的做法是:對序列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();
}
}