知识共享—java常用算法分析及具体实现(雷惊风)
- 格式:docx
- 大小:31.19 KB
- 文档页数:25
经典的五子棋java程序(源带码)直接复制粘贴importjava.awt.*;importjava.awt.event.*;importjava.applet.Applet;importjava.awt.Color;publicclassenzitextends Applet implements ActionListener,MouseListener,MouseMotionListener,ItemListener{intcolor_Qizi=0;//旗子的颜色标识0:白子1:黑子intintGame_Start=0;//游戏开始标志0未开始1游戏中intintGame_Body[][]=newint[16][16]; //设置棋盘棋子状态0 无子1 白子2 黑子Button b1=new Button("游戏开始");Button b2=new Button("重置游戏");Label lblWin=new Label(" ");Checkbox ckbHB[]=new Checkbox[2];CheckboxGroupckgHB=new CheckboxGroup();publicvoidinit(){setLayout(null);addMouseListener(this);add(b1);b1.setBounds(330,50,80,30);b1.addActionListener(this);add(b2);b2.setBounds(330,90,80,30);b2.addActionListener(this);ckbHB[0]=new Checkbox("白子先",ckgHB,false);ckbHB[0].setBounds(320,20,60,30);ckbHB[1]=new Checkbox("黑子先",ckgHB,false);ckbHB[1].setBounds(380,20,60,30);add(ckbHB[0]);add(ckbHB[1]);ckbHB[0].addItemListener(this);ckbHB[1].addItemListener(this);add(lblWin);lblWin.setBounds(330,130,80,30);Game_start_csh();}publicvoiditemStateChanged(ItemEvent e){if (ckbHB[0].getState()) //选择黑子先还是白子先{color_Qizi=0;}else{color_Qizi=1;}}publicvoidactionPerformed(ActionEvent e){Graphics g=getGraphics();if (e.getSource()==b1){Game_start();}else{Game_re();}}publicvoidmousePressed(MouseEvent e){}publicvoidmouseClicked(MouseEvent e){Graphics g=getGraphics();int x1,y1;x1=e.getX();y1=e.getY();if (e.getX()<20 || e.getX()>300 || e.getY()<20 || e.getY()>300) {return;}if (x1%20>10){x1+=20;}if(y1%20>10){y1+=20;}x1=x1/20*20;y1=y1/20*20;set_Qizi(x1,y1);}publicvoidmouseEntered(MouseEvent e){}publicvoidmouseExited(MouseEvent e){}publicvoidmouseReleased(MouseEvent e){}publicvoidmouseDragged(MouseEvent e){}publicvoidmouseMoved(MouseEvent e){}publicvoid paint(Graphics g){draw_qipan(g);}publicvoid set_Qizi(intx,int y) //落子{if (intGame_Start==0) //判断游戏未开始{return;}if (intGame_Body[x/20][y/20]!=0){return;}Graphics g=getGraphics();if (color_Qizi==1)//判断黑子还是白子{g.setColor(Color.black);color_Qizi=0;}else{g.setColor(Color.white);color_Qizi=1;}g.fillOval(x-10,y-10,20,20);intGame_Body[x/20][y/20]=color_Qizi+1;if (Game_win_1(x/20,y/20)) //判断输赢{lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0;}if (Game_win_2(x/20,y/20)) //判断输赢{lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0;}if (Game_win_3(x/20,y/20)) //判断输赢{lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0;}if (Game_win_4(x/20,y/20)) //判断输赢{lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0;}}public String Get_qizi_color(int x){if (x==0){return"黑子";}else{return"白子";}}publicvoid draw_qipan(Graphics G) //画棋盘15*15{G.setColor(Color.lightGray);G.fill3DRect(10,10,300,300,true);G.setColor(Color.black);for(inti=1;i<16;i++){G.drawLine(20,20*i,300,20*i);G.drawLine(20*i,20,20*i,300);}}publicvoid Game_start() //游戏开始{intGame_Start=1;Game_btn_enable(false);b2.setEnabled(true);}publicvoid Game_start_csh() //游戏开始初始化{intGame_Start=0;Game_btn_enable(true);b2.setEnabled(false);ckbHB[0].setState(true);for (inti=0;i<16 ;i++ ){for (int j=0;j<16 ;j++ ){intGame_Body[j]=0;}}lblWin.setText("");}publicvoid Game_re() //游戏重新开始{repaint();Game_start_csh();}publicvoid Game_btn_enable(boolean e) //设置组件状态{b1.setEnabled(e);b2.setEnabled(e);ckbHB[0].setEnabled(e);ckbHB[1].setEnabled(e);}publicboolean Game_win_1(intx,int y) //判断输赢横{int x1,y1,t=1;x1=x;y1=y;for (inti=1;i<5 ;i++ ){if (x1>15){break;}if (intGame_Body[x1+i][y1]==intGame_Body[x][y]) {t+=1;}else{break;}}for (inti=1;i<5 ;i++ ){if (x1<1){break;}if(intGame_Body[x1-i][y1]==intGame_Body[x][y]) {t+=1;}else{break;}}if (t>4){returntrue;}else{returnfalse;}}publicboolean Game_win_2(intx,int y) //判断输赢竖{int x1,y1,t=1;x1=x;y1=y;for (inti=1;i<5 ;i++ ){if (x1>15){break;}if (intGame_Body[x1][y1+i]==intGame_Body[x][y]){t+=1;}else{break;}}for (inti=1;i<5 ;i++ ){if (x1<1){break;}if(intGame_Body[x1][y1-i]==intGame_Body[x][y]) {t+=1;}else{break;}}if (t>4){returntrue;}else{returnfalse;}}publicboolean Game_win_3(intx,int y) //判断输赢左斜{int x1,y1,t=1;x1=x;y1=y;for (inti=1;i<5 ;i++ ){if (x1>15){break;}if (intGame_Body[x1+i][y1-i]==intGame_Body[x][y]) {t+=1;}else{break;}}for (inti=1;i<5 ;i++ ){if (x1<1){break;}if(intGame_Body[x1-i][y1+i]==intGame_Body[x][y]) {t+=1;}else{break;}}if (t>4){returntrue;}else{returnfalse;}}publicboolean Game_win_4(intx,int y) //判断输赢左斜{int x1,y1,t=1;x1=x;y1=y;for (inti=1;i<5 ;i++ ){if (x1>15){break;}if (intGame_Body[x1+i][y1+i]==intGame_Body[x][y]) {t+=1;}else{break;}}for (inti=1;i<5 ;i++ ){if (x1<1){break;}if(intGame_Body[x1-i][y1-i]==intGame_Body[x][y]) {t+=1;}else{break;}}if (t>4){returntrue;}else{returnfalse;}}}。
java文本重复度算法在Java中,可以使用不同的算法来计算文本的重复度。
下面我将介绍几种常见的算法。
1. 暴力匹配算法(Brute Force):这是一种简单直接的算法,它通过比较文本中的每个字符来计算重复度。
具体步骤如下:遍历文本中的每个字符。
对于每个字符,再次遍历文本中的其余字符,以查找是否存在相同的字符。
如果存在相同的字符,则增加重复度计数器。
最后,通过计算重复度计数器与文本长度的比例来得到文本的重复度。
这种算法的时间复杂度为O(n^2),其中n是文本的长度。
虽然简单易懂,但对于大型文本来说效率较低。
2. 哈希算法(Hashing):哈希算法是一种常用的文本重复度计算算法。
它通过将文本转换为哈希值来判断文本的相似程度。
具体步骤如下:将文本转换为哈希值,例如使用MD5、SHA-1等哈希算法。
比较不同文本的哈希值,如果哈希值相同,则认为文本相似度较高。
根据相同哈希值的文本数量和总文本数量的比例来计算重复度。
哈希算法的时间复杂度较低,通常为O(n),其中n是文本的长度。
它可以快速计算文本的重复度,但可能存在哈希冲突的问题。
3. KMP算法(Knuth-Morris-Pratt):KMP算法是一种高效的字符串匹配算法,也可以用于计算文本的重复度。
具体步骤如下:构建文本的前缀表,用于记录每个位置的最长公共前后缀长度。
遍历文本,通过比较当前字符和前缀表中的值来确定是否存在重复。
根据重复出现的次数和文本长度来计算重复度。
KMP算法的时间复杂度为O(n+m),其中n是文本长度,m是模式串长度。
相较于暴力匹配算法,KMP算法可以大幅提高匹配效率。
以上是几种常见的Java文本重复度计算算法。
根据具体需求和文本规模,选择适合的算法可以提高计算效率和准确度。
文章标题:深度解析Java中的MD5加密算法及其用法一、介绍在当今信息技术快速发展的时代,数据安全问题愈发凸显。
作为一种常用的加密算法,MD5(Message-Digest Algorithm 5)因其快速性和高安全性而受到广泛关注和应用。
本文将深度解析Java中的MD5加密算法及其用法,帮助读者更深入地理解和应用该加密算法。
二、MD5加密算法简介MD5是一种散列函数,其输出通常为128位的数据。
MD5算法以输入的消息为基础,通过一系列复杂的运算,生成一个128位的散列值作为加密后的结果。
MD5算法的特点是不可逆,即无法通过散列值逆向得到原始消息。
MD5算法常用于对密码、数字签名等敏感信息进行加密存储。
三、Java中的MD5加密算法实现在Java中,要使用MD5加密算法,通常需要借助java.security包下的MessageDigest类。
下面是一个简单的Java示例代码,演示了如何使用MD5加密算法对字符串进行加密:```javaimport java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MD5Demo {public String encrypt(String input) {try {MessageDigest md =MessageDigest.getInstance("MD5");md.update(input.getBytes());byte[] digest = md.digest();StringBuilder sb = new StringBuilder();for (byte b : digest) {sb.append(String.format("%02x", b & 0xff)); }return sb.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}}public static void main(String[] args) {MD5Demo demo = new MD5Demo();String input = "Hello, MD5";String encrypted = demo.encrypt(input);System.out.println("MD5加密后:" + encrypted);}}```四、MD5加密算法的应用场景MD5加密算法在实际应用中有着广泛的应用场景,以下是一些常见的应用场景:1. 密码加密:在用户注册、登录等情景中,可使用MD5加密算法对用户密码进行加密存储,确保用户信息的安全性。
教你怎么⽤Java开发扫雷游戏⽬录⼀、效果图⼆、实现思路三、代码实现3.1 设置头部3.2 设置游戏区域按钮3.3 设置雷3.4 计算周围雷的数量并显⽰3.5 添加点击事件3.6 打开指定按钮3.7 触雷爆炸3.8 递归打开周围3.9 ⿏标右键事件四、胜利判定⼀、效果图⼆、实现思路1.界⾯上可以点开的各种实际都是按钮,创建9⾏9列的⼆维数组,然后根据这个数组来创建JButton。
2.对应创建⼆维数组data,⽤来存取数据,0表⽰周围⽆雷,-1表⽰当前是雷,其他数字表⽰周围雷的数量。
3.对应创建⼆维数组state,⽤来存取按钮状态,0未打开,1 打开 2旗⼦ 3 未知(控制显⽰对应的图标)4.设置雷:随机⾏数 i 和列数 j,根据随机到 i、j 从⼆维数组data中取出对应的元素值,若值不为-1(不是雷),则将此元素data[i][j]设置为-1,若值是-1(已经是雷了),则跳过,不管是否跳过都进⾏递归,直到雷的数量达到设定的最⼤数量,跳出递归。
5.设置周围雷的数量:计算每个元素周围的雷数量(周围指的是左上、上、右上、右、右下、下、左下、左这8个位置),循环⼆维数组data,判断当前值不是-1,则需要计算周围雷的数量,等会细说。
6.有任⼀格⼦被揭开,则游戏开始并且计时,当格⼦被揭开的时候分3种情况(1)格⼦是雷,执⾏爆炸动画,游戏结束。
(2)当前格⼦周围有雷,则仅仅打开此格⼦,对应显⽰周围雷数量的数字图⽚。
(3)当前格⼦不是雷且周围没有雷(data取到的元素值为0),则依次打开周围,并且被打开的周围元素也没有雷的情况下,继续打开(递归)。
7.右键可以进⾏插⼩旗、打问号等操作(对数组state进⾏的操作)。
三、代码实现3.1 设置头部//设置头部private void setHeader() {Container container = new Container();container.setLayout(new GridLayout(1, 3));timeJLabel = new JLabel("时间:"+time,JLabel.CENTER);timeJLabel.setForeground(Color.DARK_GRAY);timeJLabel.setFont(new Font("微软雅⿊",Font.BOLD, 16));leiJLabel = new JLabel("雷:"+curLeiCount,JLabel.CENTER);leiJLabel.setForeground(Color.DARK_GRAY);leiJLabel.setFont(new Font("微软雅⿊",Font.BOLD, 16));reStart = new JButton((ImageIcon)imageMap.get(21));Dimension preferredSize = new Dimension(100,40);reStart.setPreferredSize(preferredSize);reStart.addActionListener(this);//注意添加顺序container.add(timeJLabel);container.add(reStart);container.add(leiJLabel);mainFrame.add(container,BorderLayout.NORTH);}3.2 设置游戏区域按钮1.创建容器,并采⽤GridLayout 布局。
《算法设计与分析》课程设计扫雷游戏设计班级计科1003班姓名指导教师开发时间2012.12.18湖南涉外经济学院信息科学与工程学院2012年12月摘要扫雷游戏是Windows操作系统自带的一个小游戏,过去的几年里Windows 操作系统历经数次换代,变得越来越庞大、复杂,但这个可爱的小游戏在任何版本的Windows操作系统里去地依然保持着原貌。
但几乎每个电脑使用者都接触过它,并且深爱着这款小游戏。
游戏上手极其简单,但是要熟练地掌握其中的操作及找出雷的技巧,难度却不低。
作为家喻户晓老少皆宜的大众游戏,其普及程度可以说是史上任何一款游戏都无法相比的。
游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块,当鼠标指针对准未翻开的方块按下右键时即表示标示或疑示地雷,反复按下右键则方块会以未标示→标示→疑似三者关系不断循环。
游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个方格内所含的地雷数,假若翻开的方块显示数字“3”,则表示以其为中心的周边方块内藏有3个地雷。
当按下的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被翻开方块的八个方向将空白方块翻开。
扫雷游戏是比较经典的一款小游戏,实现它的方法很多,可以用很多不同算法和语言实现,如C,C++,VB,Jave,C#等。
本论文研究的是以java为开发环境,设计并开发一款扫雷游戏,其功能类似于Windows操作系统自带的扫雷游戏。
论文首先介绍了制作游戏的整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为重要,鼠标事件是利用鼠标所发出的信息了解使用者的意图,进而做出相对应的动作。
关键词:java;扫雷;课程设计;目录第一章引言 (2)1.1 课题背景及意义 (2)1.2开发的目的以及意义 (2)1.3关于本课题 (3)第二章游戏的总体分析 (4)2.1 游戏功能简介 (4)2.2 扫雷游戏的基本要求 (4)2.3 功能需求分析 (5)第三章游戏的具体分析 (6)3.1 总体功能图 (6)3.2 主要功能设计流程 (7)3.2.1 总体流程图 (7)图3-2-1 总体流程图 (7)3.2.2雷区设计流程图 (8)3.2.3排行榜设计流程图 (9)3.3各个类的详细介绍与关键代码 (9)3.3.1 类之间关系图 (9)3.3.2 MainFrame类 (10)3.3.3 LEDNumber类 (12)3.3.4 MineGrid类 (13)3.3.5 AboutDialog类 (13)3.3.6 CustomDialog类 (14)3.3.7 ImageFactory类 (15)3.3.8 UserDialog类 (15)3.3.9 LevelInfo类 (15)3.3.10 LogDialog类 (17)第四章游戏的实现 (19)4.1游戏的初级界面 (19)4.2游戏的中级界面 (20)4.3游戏的高级界面 (21)4.3 游戏的打包发布过程 (22)第五章结论 (24)参考文献 (25)第一章引言1.1 课题背景及意义扫雷最原始的版本可以追溯到1973年一款名为“方块”的游戏。
java相关加密解密方法
Java提供了许多加密解密方法,包括对称加密、非对称加密、
哈希加密等。
下面我将从多个角度来介绍一些常见的加密解密方法。
1. 对称加密:
对称加密使用相同的密钥进行加密和解密。
Java中常用的对称
加密算法包括AES、DES和3DES。
使用这些算法可以通过Java的Cipher类来实现加密和解密操作。
对称加密算法适合于对数据进行
加密保护,但需要注意密钥的安全存储和传输。
2. 非对称加密:
非对称加密使用公钥和私钥进行加密和解密。
Java中常用的非
对称加密算法包括RSA和DSA。
可以使用Java的KeyPairGenerator
类生成密钥对,并使用Cipher类进行加密和解密操作。
非对称加密
算法适合于数据的签名和加密传输,可以实现安全的数据通信。
3. 哈希加密:
哈希加密算法将数据转换为固定长度的哈希值,不可逆。
Java 中常用的哈希加密算法包括MD5和SHA系列算法。
可以使用Java的MessageDigest类进行哈希加密操作。
哈希加密适合于对数据进行完整性校验和摘要计算。
除了以上的加密解密方法,Java还提供了许多其他的加密解密工具和框架,如Bouncy Castle、JCE(Java Cryptography Extension)等,可以满足不同场景下的加密解密需求。
在实际应用中,需要根据具体的安全需求和性能要求选择合适的加密解密方法,并且注意密钥管理、安全传输等安全实践,以保障数据的安全性和完整性。
希望以上介绍对你有所帮助。
java实现简单扫雷游戏本⽂实例为⼤家分享了java实现简单扫雷游戏的具体代码,供⼤家参考,具体内容如下package com.test.swing;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;/*** 这个是⼀个简单的扫雷例⼦,刚接触swing编写的,适合新⼿练习* 该程序使⽤setBounds(x,y,w,h)对控件布局* 做法参考win xp⾃带的扫雷,当然还写功能没做出来,* 另外做出来的功能有些还存在bug** @author Ping_QC*/public class Test extends JFrame implements ActionListener, Runnable,MouseListener {private static final long serialVersionUID = -2417758397965039613L;private final int EMPTY = 0;private final int MINE = 1;private final int CHECKED = 2;private final int MINE_COUNT = 10; // 雷的个数private final int BUTTON_BORDER = 50; // 每个点的尺⼨private final int MINE_SIZE = 10; // 界⾯规格, 20x20private final int START_X = 20; // 起始位置xprivate final int START_Y = 50; // 起始位置yprivate boolean flag;private JButton[][] jb;private JLabel jl;private JLabel showTime;private int[][] map;/*** 检测某点周围是否有雷,周围点的坐标可由该数组计算得到*/private int[][] mv = { { -1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 }, { 1, 0 },{ 1, -1 }, { 0, -1 }, { -1, -1 } };/*** 随机产⽣设定个数的雷*/public void makeMine() {int i = 0, tx, ty;for (; i < MINE_COUNT;) {tx = (int) (Math.random() * MINE_SIZE);ty = (int) (Math.random() * MINE_SIZE);if (map[tx][ty] == EMPTY) {map[tx][ty] = MINE;i++; // 不记重复产⽣的雷}}}/*** 将button数组放到frame上,与map[][]数组对应*/public void makeButton() {for (int i = 0; i < MINE_SIZE; i++) {for (int j = 0; j < MINE_SIZE; j++) {jb[i][j] = new JButton();// if (map[i][j] == MINE)// jb[i][j].setText(i+","+j);// listener addjb[i][j].addActionListener(this);jb[i][j].addMouseListener(this);jb[i][j].setName(i + "_" + j); // ⽅便点击是判断是点击了哪个按钮// Font font = new Font(Font.SERIF, Font.BOLD, 10);// jb[i][j].setFont(font);// jb[i][j].setText(i+","+j);jb[i][j].setBounds(j * BUTTON_BORDER + START_X, i* BUTTON_BORDER + START_Y, BUTTON_BORDER, BUTTON_BORDER); this.add(jb[i][j]);}}}public void init() {flag = false;jl.setText("欢迎测试,⼀共有" + MINE_COUNT + "个雷");jl.setVisible(true);jl.setBounds(20, 20, 500, 30);this.add(jl);showTime.setText("已⽤时:0 秒");showTime.setBounds(400, 20, 100, 30);this.add(showTime);makeMine();makeButton();this.setSize(550, 600);this.setLocation(700, 100);this.setResizable(false);this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setVisible(true);}public Test(String title) {super(title);this.setLayout(null); //不使⽤布局管理器,每个控件的位置⽤setBounds设定jb = new JButton[MINE_SIZE][MINE_SIZE];jl = new JLabel();showTime = new JLabel();map = new int[MINE_SIZE][MINE_SIZE]; // 将按钮映射到数组中}public static void main(String[] args) {Test test = new Test("Hello Miner!");test.init();test.run();}@Overridepublic void actionPerformed(ActionEvent e) {Object obj = e.getSource();int x, y;if ((obj instanceof JButton) == false) {showMessage("错误", "内部错误");return;}String[] tmp_str = ((JButton) obj).getName().split("_");x = Integer.parseInt(tmp_str[0]);y = Integer.parseInt(tmp_str[1]);if (map[x][y] == MINE) {showMessage("死亡", "你踩到地雷啦~~~");flag = true;showMine();return;}dfs(x, y, 0);checkSuccess();}/*** 每次点击完后,判断有没有把全部雷都找到通过计算状态为enable的按钮的个数来判断 */private void checkSuccess() {int cnt = 0;for (int i = 0; i < MINE_SIZE; i++) {for (int j = 0; j < MINE_SIZE; j++) {if (jb[i][j].isEnabled()) {cnt++;}}}if (cnt == MINE_COUNT) {String tmp_str = showTime.getText();tmp_str = tmp_str.replaceAll("[^0-9]", "");showMessage("胜利", "本次扫雷共⽤时:" + tmp_str + "秒");flag = true;showMine();}}private int dfs(int x, int y, int d) {map[x][y] = CHECKED;int i, tx, ty, cnt = 0;for (i = 0; i < 8; i++) {tx = x + mv[i][0];ty = y + mv[i][1];if (tx >= 0 && tx < MINE_SIZE && ty >= 0 && ty < MINE_SIZE) {if (map[tx][ty] == MINE) {cnt++;// 该点附近雷数统计} else if (map[tx][ty] == EMPTY) {;} else if (map[tx][ty] == CHECKED) {;}}}if (cnt == 0) {for (i = 0; i < 8; i++) {tx = x + mv[i][0];ty = y + mv[i][1];if (tx >= 0 && tx < MINE_SIZE && ty >= 0 && ty < MINE_SIZE&& map[tx][ty] != CHECKED) {dfs(tx, ty, d + 1);}}} else {jb[x][y].setText(cnt + "");}jb[x][y].setEnabled(false);return cnt;}/*** 在jl标签上显⽰⼀些信息** @param title* @param info*/private void showMessage(String title, String info) {jl.setText(info);System.out.println("in functino showMessage() : " + info);}public void run() {int t = 0;while (true) {if (flag) {break;}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}t++;showTime.setText("已⽤时:" + t + " 秒");}// showMine();}private void showMine() {// Icon iconMine = new ImageIcon("e:/mine.jpg");for (int i = 0; i < MINE_SIZE; i++) {for (int j = 0; j < MINE_SIZE; j++) {if (map[i][j] == MINE) {jb[i][j].setText("#");// jb[i][j].setIcon(iconMine);}}}}@Overridepublic void mouseClicked(MouseEvent e) {if (e.getButton() == 3) {Object obj = e.getSource();if ((obj instanceof JButton) == false) {showMessage("错误", "内部错误");return;}String[] tmp_str = ((JButton) obj).getName().split("_");int x = Integer.parseInt(tmp_str[0]);int y = Integer.parseInt(tmp_str[1]);if ("{1}quot;.equals(jb[x][y].getText())) {jb[x][y].setText("");} else {jb[x][y].setText("{1}quot;);}/* if(jb[x][y].getIcon() == null){jb[x][y].setIcon(new ImageIcon("e:/flag.jpg"));}else{jb[x][y].setIcon(null);}*/}}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}}更多精彩游戏,请参考专题以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
一、引言近年来,随着计算机科学和数学的不断发展,使用Java编写求解一元多次方程的解的方法变得越来越重要。
多次方程是数学中的基本概念,它在实际生活和科学研究中有着广泛的应用。
本文将以深度和广度兼具的方式探讨如何使用Java编写求解一元多次方程的解,帮助读者全面、深刻地理解这一主题。
二、理论基础求解一元多次方程的解涉及到数学方程的求解方法,其中包括但不限于牛顿迭代法、拉格朗日插值法、线性代数方法等。
在使用Java编程求解一元多次方程时,我们需要充分理解这些数学求解方法的原理和应用场景,以便在编写代码时能够合理选择并应用适当的方法。
三、Java编程实践在Java编程实践中,我们需要首先定义多次方程的系数和次数,然后根据具体的求解方法编写对应的Java算法。
对于牛顿迭代法,我们可以使用Java的循环和递归来实现方程的迭代求解;对于拉格朗日插值法,我们可以编写Java的多项式插值算法来求解方程的解。
在这一步骤中,我们需要考虑算法的效率、精度和稳定性,确保我们编写的Java代码能够准确求解一元多次方程的解。
四、代码示例以下是一个使用Java编写求解一元多次方程的解的简单示例:```javapublic class PolynomialEquationSolver {// 定义多次方程的系数和次数private double[] coefficients;private int degree;// 构造方法public PolynomialEquationSolver(double[] coefficients) { this.coefficients = coefficients;this.degree = coefficients.length - 1;}// 牛顿迭代法求解多次方程的根public double solveByNewton(double initialGuess, double tolerance) {// 编写牛顿迭代法的具体实现// ...return root;}// 拉格朗日插值法求解多次方程的根public double solveByLagrangeInterpolation(double x) { // 编写拉格朗日插值法的具体实现// ...return root;}}public class Main {public static void main(String[] args) {double[] coefficients = {1, -3, 2}; // 1*x^2 - 3*x + 2 = 0PolynomialEquationSolver solver = new PolynomialEquationSolver(coefficients);double root1 = solver.solveByNewton(0, 0.0001);double root2 = solver.solveByLagrangeInterpolation(2);System.out.println("Root 1: " + root1);System.out.println("Root 2: " + root2);}}```五、总结回顾通过本文的探讨,我们全面、深入地了解了如何使用Java编写求解一元多次方程的解。
JAVA实现经典扫雷游戏的⽰例代码⽬录前⾔主要设计功能截图代码实现总结前⾔windows⾃带的游戏《扫雷》是陪伴了⽆数⼈的经典游戏,本程序参考《扫雷》的规则进⾏了简化,⽤java语⾔实现,采⽤了swing技术进⾏了界⾯化处理,设计思路⽤了⾯向对象思想。
主要需求1、要有难度等级,初级,中级,⾼级2、由玩家逐个翻开⽅块,以找出所有地雷为最终游戏⽬标。
如果玩家翻开的⽅块有地雷,则游戏结束3、游戏主区域由很多个⽅格组成。
使⽤⿏标左键随机点击⼀个⽅格,⽅格即被打开并显⽰出⽅格中的数字;⽅格中数字则表⽰其周围的8个⽅格隐藏了⼏颗雷。
4、⽤户右键可标记雷的位置5、雷都被标记出来则胜利主要设计1、格⼦格数固定为10*10格2、难度等级,初级:12,中级:24,⾼级:363、点击格⼦时,产⽣没有引爆的地图效果;4、点击格⼦时,此格⼦是雷,则显⽰所有雷的位置,并递归清空⾮雷格⼦,结束游戏5、实现检查所有的雷是否都被标记出来了,如果是,则胜利算法。
6、实现计时器算法,⽤来计时显⽰游戏开始多少秒7、实现难度等级,雷数的显⽰8、实现⿏标左键的实现逻辑9、实现⿏标右键的标记逻辑功能截图开始界⾯左键选中格⼦效果左键选中雷效果右键标记雷效果胜利效果代码实现程序启动类public class JMine extends JFrame implements MouseListener, ActionListener {private JMineArth mine;private JMineButton[][] mineButton;private GridBagConstraints constraints;private JPanel pane;private GridBagLayout gridbag;private boolean gameStarted;private static JCounter mineCounter;private static JCounter timeCounter;private Timer timer;private Timer winTimer = new Timer();public int numMine;public int numFlaged;private JMenuBar mb;private JMenu mGame;private JMenuItem miEasy;private JMenuItem miMiddle;private JMenuItem miHard;private JMenuItem miExit;private JMenu mHelp;private JMenuItem miAbout;private JPanel controlPane;private JButton bTest;private AboutFrame about;private WinFrame winFrame;private ImageIcon[] mineNumIcon = { new ImageIcon(JMine.class.getClassLoader().getResource("blank1.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("1.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("2.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("3.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("4.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("5.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("6.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("7.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("8.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("0.gif"))};private ImageIcon[] mineStatus = { new ImageIcon(JMine.class.getClassLoader().getResource("blank1.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("flag.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("question.gif")) }; private ImageIcon[] mineBombStatus = { new ImageIcon(JMine.class.getClassLoader().getResource("0.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("mine.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("wrongmine.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("bomb.gif")) };private ImageIcon[] faceIcon = { new ImageIcon(JMine.class.getClassLoader().getResource("smile.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("Ooo.gif")) };// You loseprivate void bomb(int row, int col){try{//System.out.println("Bomb!");for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {mineButton[i][j].setIcon(mineBombStatus[0]);int toShow;toShow = mine.mine[i][j] != 9 ? 0 : 1;mineButton[i][j].setClickFlag(true);if (toShow == 1 && (i != row || j != col)) {mineButton[i][j].setIcon(mineBombStatus[toShow]);mineButton[i][j].setClickFlag(true);} else if (toShow == 1 && (i == row && j == col)) {mineButton[i][j].setIcon(mineBombStatus[3]);mineButton[i][j].setClickFlag(true);} else if (toShow == 0 && mineButton[i][j].getFlag() != 1) { mineButton[i][j].setEnabled(false);} else if (toShow == 0 && mineButton[i][j].getFlag() == 1) { mineButton[i][j].setIcon(mineBombStatus[2]);mineButton[i][j].setClickFlag(true);}}}timer.cancel();}catch (Exception e){}}// check if you win() {private boolean isWin() {for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {if (mine.mine[i][j] == 9 && mineButton[i][j].getFlag() != 1) { return (false);}if (mine.mine[i][j] != 9 && mineButton[i][j].getFlag() == 1) { return (false);}if (mine.mine[i][j] != 9&& mineButton[i][j].getClickFlag() == false) {return (false);}}}return (true);}// You Winprivate void win(){timer.cancel();winFrame.setVisible(true);winTimer.schedule(new TimerTask(){public void run() {while(!winFrame.getWinOk()){}numMine = winFrame.getMineNum();winFrame.setVisible(false);setNewGame(numMine);//System.out.println("Jerry Debug:"+numMine);this.cancel();winFrame.setWinOk(false);}},0L);}// Constructor of the gamepublic JMine() {super("JMine Game");setSize(250, 350);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Insets space = new Insets(0, 0, 0, 0);// Game varsgameStarted = false;numMine = 12;numFlaged = 0;ImageIcon myIcon = new ImageIcon(JMine.class.getClassLoader().getResource("blank1.gif")); gridbag = new GridBagLayout();constraints = new GridBagConstraints();pane = new JPanel();pane.setLayout(gridbag);constraints.fill = GridBagConstraints.BOTH;constraints.anchor = GridBagConstraints.CENTER;// Begin Menu Setmb = new JMenuBar();mGame = new JMenu("Game");miEasy = new JMenuItem("Easy");miEasy.addActionListener(this);miMiddle = new JMenuItem("Middle");miMiddle.addActionListener(this);miHard = new JMenuItem("Hard");miHard.addActionListener(this);miExit = new JMenuItem("Exit");miExit.addActionListener(this);mGame.add(miEasy);mGame.add(miMiddle);mGame.add(miHard);mGame.addSeparator();mGame.add(miExit);mb.add(mGame);mHelp = new JMenu("Help");miAbout = new JMenuItem("About...");mHelp.add(miAbout);miAbout.addActionListener(this);mb.add(mHelp);this.setJMenuBar(mb);// end of Menu Set// Control PanelcontrolPane = new JPanel();bTest = new JButton(faceIcon[0]);bTest.setSize(26, 27);bTest.setMargin(space);bTest.addMouseListener(this);bTest.setPressedIcon(faceIcon[1]);mineCounter = new JCounter(numMine);timeCounter = new JCounter();controlPane.add(mineCounter);controlPane.add(bTest);controlPane.add(timeCounter);buildConstraints(constraints, 0, 0, 10, 2, 100, 100);gridbag.setConstraints(controlPane, constraints);pane.add(controlPane);// BottonsmineButton = new JMineButton[10][10];for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {mineButton[i][j] = new JMineButton(i, j, myIcon);mineButton[i][j].addMouseListener(this);mineButton[i][j].setMargin(space);buildConstraints(constraints, j, i + 3, 1, 1, 100, 100);gridbag.setConstraints(mineButton[i][j], constraints);pane.add(mineButton[i][j]);}}// Content PanesetContentPane(pane);setLocation(200, 150);setVisible(true);// About Frameabout = new AboutFrame("JMine About");winFrame = new WinFrame("You win!");}// Set the GUI objects positionsvoid buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy) {gbc.gridx = gx;gbc.gridy = gy;gbc.gridwidth = gw;gbc.gridheight = gh;gbc.weightx = wx;gbc.weighty = wy;}// the methods to check if there were mines, to be nestedvoid checkMine(int row, int col){int i, j;i = row < 0 ? 0 : row;i = i > 9 ? 9 : i;j = col < 0 ? 0 : col;j = j > 9 ? 9 : j;//System.out.println("Check Mine row:"+i + ",col:" +j);if (mine.mine[i][j] == 9) {bomb(i, j);} else if (mine.mine[i][j] == 0&& mineButton[i][j].getClickFlag() == false) {mineButton[i][j].setClickFlag(true);showLabel(i, j);for (int ii = i - 1; ii <= i + 1; ii++)for (int jj = j - 1; jj <= j + 1; jj++)checkMine(ii, jj);} else {showLabel(i, j);mineButton[i][j].setClickFlag(true);}if (isWin()) {win();}}private void clearAll(int row, int col){int top, bottom, left, right;top = row - 1 > 0 ? row - 1 : 0;bottom = row + 1 < 10 ? row + 1 : 9;left = col - 1 > 0 ? col - 1 : 0;right = col + 1 < 10 ? col + 1 : 9;for (int i = top; i <= bottom; i++) {for (int j = left; j <= right; j++) {if (mineButton[i][j].getFlag() != 1)checkMine(i, j);}}}private void resetAll() {for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {mineButton[i][j].setFlag(0);mineButton[i][j].setClickFlag(false);mineButton[i][j].setIcon(mineStatus[0]);mineButton[i][j].setEnabled(true);mineButton[i][j].setVisible(true);}}}// to flag the mine you want to flag outvoid flagMine(int row, int col) {//System.out.println("Jerry Arrives here!");int i, j;i = row < 0 ? 0 : row;i = i > 9 ? 9 : i;j = col < 0 ? 0 : col;j = j > 9 ? 9 : j;if (mineButton[i][j].getFlag() == 0) {numFlaged++;} else if (mineButton[i][j].getFlag() == 1) {numFlaged--;}mineCounter.resetCounter(numMine - numFlaged >= 0 ? numMine - numFlaged: 0);mineButton[i][j].setFlag((mineButton[i][j].getFlag() + 1) % 3);showFlag(i, j);if (isWin()) {win();}}// show the numbers of the nearby minesvoid showLabel(int row, int col) {//System.out.println("ShowLabel row:" + row + ",col:" + col);int toShow;toShow = mine.mine[row][col];if (toShow != 0) {mineButton[row][col].setIcon(mineNumIcon[toShow]);mineButton[row][col].setClickFlag(true);//mineButton[row][col].setEnabled(false);} else {//mineButton[row][col].setIcon(mineNumIcon[0]);//mineButton[row][col].setClickFlag(true);mineButton[row][col].setEnabled(false);}}// circle the flag with blank, flaged, questionedvoid showFlag(int row, int col) {mineButton[row][col].setIcon(mineStatus[mineButton[row][col].getFlag()]);}// the mouse events listener methodspublic void mouseEntered(MouseEvent e) {//System.out.println("Jerry Test");}// method to start the new gameprivate void startNewGame(int num, int row, int col){mine = new JMineArth(num, row, col);//mine.printMine();gameStarted = true;timer = new Timer();timer.scheduleAtFixedRate(new TimerTask(){public void run() {timeCounter.counterAdd();//System.out.println(timeCounter.getCounterNum());}},1000,1000);}public void setNewGame(int num) {resetAll();numMine = num;numFlaged = 0;gameStarted = false;mineCounter.resetCounter(numMine);timeCounter.resetCounter(0);}// the event handle to deal with the mouse clickpublic void mouseClicked(MouseEvent e) {if (e.getSource() == bTest) {setNewGame(numMine);return;}int row, col;row = ((JMineButton) e.getSource()).getRow();col = ((JMineButton) e.getSource()).getCol();if (!gameStarted) {startNewGame(numMine, row, col);}if (e.getModifiers() == (InputEvent.BUTTON1_MASK + InputEvent.BUTTON3_MASK)) { //System.out.println("HA");clearAll(row, col);}if (!mineButton[row][col].getClickFlag()) {if (e.getModifiers() == InputEvent.BUTTON1_MASK) {//System.out.println("LeftButton");if (mineButton[row][col].getFlag() == 1) {return;} else {checkMine(row, col);}} else if (e.getModifiers() == InputEvent.BUTTON3_MASK) { //System.out.println("RightButton");flagMine(row, col);} else {//System.out.println("MiddleButton");}}}public void mousePressed(MouseEvent e) {//System.out.println("Jerry Press");}public void mouseReleased(MouseEvent e) {//System.out.println("Jerry Release");}public void mouseExited(MouseEvent e) {//System.out.println("Jerry Exited");}public void actionPerformed(ActionEvent e) {try {if (e.getSource() == miEasy) {setNewGame(12);return;}if (e.getSource() == miMiddle) {setNewGame(24);return;}if (e.getSource() == miHard) {setNewGame(36);return;}if (e.getSource() == miExit) {System.exit(0);}if (e.getSource() == miAbout) {about.setVisible(true);}} catch (Exception ie) {}}public static void main(String [] args) {JMine jmine = new JMine();jmine.setVisible(true);}}地雷分布图算法类public class JMineArth {public int [][] mine;private boolean fMineSet;JMineArth(int mineNum, int row, int col) {mine = new int[10][10];setMine(mineNum, row, col);setMineNum();}private void setMine(int mineNum, int Outrow, int Outcol) {int col=0, row = 0, i=0;//Math.srand(now);while (i < mineNum) {col = (int)(Math.random()*100)%10;row = (int)(Math.random()*100)%10;if (mine[col][row]==0 && (row!=Outrow || col!=Outcol || Outrow==10 )) {mine[row][col]=9;i++;}}}private void setMineNum() {for ( int i=0 ; i <10; i++) {for (int j=0; j < 10; j++) {mine[i][j]=mine[i][j]==9?9:checkMineNum(i,j);}}fMineSet = true;}private int checkMineNum(int ii,int jj) {int top,bottom, left, right, count=0;top=ii-1>0?ii-1:0;bottom=ii+1<10?ii+1:9;left=jj-1>0?jj-1:0;right=jj+1<10?jj+1:9;for (int i=top; i<=bottom; i++) {for(int j=left; j<= right; j++) {if (mine[i][j]==9) count++;}}return(count);}public void printMine() {for (int i = 0; i < 10; i++) {for (int j=0; j < 10; j++) {System.out.print(this.mine[i][j] + " ");}System.out.println();}}public static void main(String[] args) {JMineArth mine = new JMineArth(Integer.parseInt(args[0]),Integer.parseInt(args[1]),Integer.parseInt(args[2]));mine.printMine();}}总结通过此次的《扫雷》游戏实现,让我对swing的相关知识有了进⼀步的了解,对java这门语⾔也有了⽐以前更深刻的认识。
java常用算法分析和实现这篇排序文章从思想理解到实现,然后到整理,花了我几天的时间,现把它记录于此,希望对大家有一定的帮助,写的不好的请不要见笑,写错了的,请指出来我更正。
最后如果对你有一定的帮助,请支持一下哦^_^ !申明:排序算法思想来自互联网,仅供参考。
插入排序直接插入排序、希尔排序选择排序简单选择排序、堆排序交换排序冒泡排序、快速排序归并排序基数排序排序基类Java代码package sort;import java.util.Arrays;import parator;import java.util.Random;/*** 排序接口,所有的排序算法都要继承该抽象类,并且要求数组中的* 元素要具有比较能力,即数组元素已实现了Comparable接口** @author jzj* @date 2009-12-5** @param <E>*/public abstract class Sort<E extends Comparable<E>> {public final Comparator<E> DEFAULT_ORDER = new DefaultComparator(); public final Comparator<E> REVERSE_ORDER = new ReverseComparator();/*** 排序算法,需实现,对数组中指定的元素进行排序* @param array 待排序数组* @param from 从哪里* @param end 排到哪里* @param c*/public abstract void sort(E[] array, int from, int end, Comparator<E> c);/*** 对数组中指定部分进行排序* @param from 从哪里* @param len 排到哪里* @param array 待排序数组* @param c 比较器*/public void sort(int from, int len, E[] array, Comparator<E> c) {sort(array, 0, array.length - 1, c);}/*** 对整个数组进行排序,可以使用自己的排序比较器,也可使用该类提供的两个比较器* @param array 待排序数组* @param c 比较器*/public final void sort(E[] array, Comparator<E> c) {sort(0, array.length, array, c);}/*** 对整个数组进行排序,采用默认排序比较器* @param array 待排序数组*/public final void sort(E[] array) {sort(0, array.length, array, this.DEFAULT_ORDER);}//默认比较器(一般为升序,但是否真真是升序还得看E是怎样实现Comparable 接口的)private class DefaultComparator implements Comparator<E> {public int compare(E o1, E o2) {return pareTo(o2);}//反序比较器,排序刚好与默认比较器相反private class ReverseComparator implements Comparator<E> {public int compare(E o1, E o2) {return pareTo(o1);}}/*** 交换数组中的两个元素的位置* @param array 待交换的数组* @param i 第一个元素* @param j 第二个元素*/protected final void swap(E[] array, int i, int j) {if (i != j) {//只有不是同一位置时才需交换E tmp = array[i];array[i] = array[j];array[j] = tmp;}}/*** 数组元素后移* @param array 待移动的数组* @param startIndex 从哪个开始移* @param endIndex 到哪个元素止*/protected final void move(E[] array, int startIndex, int endIndex) { for (int i = endIndex; i >= startIndex; i--) {array[i + 1] = array[i];}}/*** 以指定的步长将数组元素后移,步长指定每个元素间的间隔* @param array 待排序数组* @param startIndex 从哪里开始移* @param endIndex 到哪个元素止* @param step 步长*/protected final void move(E[] array, int startIndex, int endIndex, intstep) {for (int i = endIndex; i >= startIndex; i -= step) {array[i + step] = array[i];}}//测试方法@SuppressWarnings("unchecked")public static final <E extends Comparable<E>> void testSort(Sort<E> sorter, E[] array) {if (array == null) {array = randomArray();}//为了第二次排序,需拷贝一份E[] tmpArr = (E[]) new Comparable[array.length];System.arraycopy(array, 0, tmpArr, 0, array.length);System.out.println("源 - " + Arrays.toString(tmpArr));sorter.sort(array, sorter.REVERSE_ORDER);System.out.println("降 - " + Arrays.toString(array));sorter.sort(tmpArr, sorter.DEFAULT_ORDER);System.out.println("升 - " + Arrays.toString(tmpArr));}//生成随机数组@SuppressWarnings("unchecked")private static <E extends Comparable<E>> E[] randomArray() { Random r = new Random(System.currentTimeMillis());Integer[] a = new Integer[r.nextInt(30)];for (int i = 0; i < a.length; i++) {a[i] = new Integer(r.nextInt(100));}return (E[]) a;}}package sort;import java.util.Arrays;import parator;import java.util.Random;/*** 排序接口,所有的排序算法都要继承该抽象类,并且要求数组中的* 元素要具有比较能力,即数组元素已实现了Comparable接口** @author jzj* @date 2009-12-5** @param <E>*/public abstract class Sort<E extends Comparable<E>> {public final Comparator<E> DEFAULT_ORDER = new DefaultComparator(); public final Comparator<E> REVERSE_ORDER = new ReverseComparator();/*** 排序算法,需实现,对数组中指定的元素进行排序* @param array 待排序数组* @param from 从哪里* @param end 排到哪里* @param c*/public abstract void sort(E[] array, int from, int end, Comparator<E> c);/*** 对数组中指定部分进行排序* @param from 从哪里* @param len 排到哪里* @param array 待排序数组* @param c 比较器*/public void sort(int from, int len, E[] array, Comparator<E> c) {sort(array, 0, array.length - 1, c);}/*** 对整个数组进行排序,可以使用自己的排序比较器,也可使用该类提供的两个比较器* @param array 待排序数组* @param c 比较器*/public final void sort(E[] array, Comparator<E> c) {sort(0, array.length, array, c);}/*** 对整个数组进行排序,采用默认排序比较器* @param array 待排序数组*/public final void sort(E[] array) {sort(0, array.length, array, this.DEFAULT_ORDER);}//默认比较器(一般为升序,但是否真真是升序还得看E是怎样实现Comparable 接口的)private class DefaultComparator implements Comparator<E> {public int compare(E o1, E o2) {return pareTo(o2);}}//反序比较器,排序刚好与默认比较器相反private class ReverseComparator implements Comparator<E> {public int compare(E o1, E o2) {return pareTo(o1);}}/*** 交换数组中的两个元素的位置* @param array 待交换的数组* @param i 第一个元素* @param j 第二个元素*/protected final void swap(E[] array, int i, int j) {if (i != j) {//只有不是同一位置时才需交换E tmp = array[i];array[i] = array[j];array[j] = tmp;}}/*** 数组元素后移* @param array 待移动的数组* @param startIndex 从哪个开始移* @param endIndex 到哪个元素止*/protected final void move(E[] array, int startIndex, int endIndex) { for (int i = endIndex; i >= startIndex; i--) {array[i + 1] = array[i];}}/*** 以指定的步长将数组元素后移,步长指定每个元素间的间隔* @param array 待排序数组* @param startIndex 从哪里开始移* @param endIndex 到哪个元素止* @param step 步长*/protected final void move(E[] array, int startIndex, int endIndex, int step) {for (int i = endIndex; i >= startIndex; i -= step) {array[i + step] = array[i];}}//测试方法@SuppressWarnings("unchecked")public static final <E extends Comparable<E>> void testSort(Sort<E> sorter, E[] array) {if (array == null) {array = randomArray();}//为了第二次排序,需拷贝一份E[] tmpArr = (E[]) new Comparable[array.length];System.arraycopy(array, 0, tmpArr, 0, array.length);System.out.println("源 - " + Arrays.toString(tmpArr));sorter.sort(array, sorter.REVERSE_ORDER);System.out.println("降 - " + Arrays.toString(array));sorter.sort(tmpArr, sorter.DEFAULT_ORDER);System.out.println("升 - " + Arrays.toString(tmpArr));}//生成随机数组@SuppressWarnings("unchecked")private static <E extends Comparable<E>> E[] randomArray() {Random r = new Random(System.currentTimeMillis());Integer[] a = new Integer[r.nextInt(30)];for (int i = 0; i < a.length; i++) {a[i] = new Integer(r.nextInt(100));}return (E[]) a;}} 插入排序直接插入排序一般直接插入排序的时间复杂度为O ( n^2 ) ,但是当数列基本有序时,如果按照有数列顺序排时,时间复杂度将改善到O( n ),另外,因直接插入排序算法简单,如果待排序列规模不很大时效率也较高。