我的“插入算法”实现

这是我的“插入算法”Java实现!

 

View Code
  1 /*
  2  * 目的:练习 "插入排序"算法
  3  * 功能:对一个随机生成的数组进行非降排序
  4  * 时间:2013.03.08
  5  * 作者:iGeneral
  6  */
  7 package part01.chapter02;
  8 
  9 import java.util.*;
 10 import java.text.SimpleDateFormat;
 11 
 12 public class _1exercise {
 13 
 14     public static void main(String[] args) {
 15         //instantiated CreateData class
 16         CreateData createData = new CreateData();
 17         ArrayList myArrayList = null;
 18         int[] myArray=null;
 19         SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
 20         // select sort method
 21         Scanner myScanner = new Scanner(System.in);
 22         System.out.println("输入'1'使用一般的实现方式\t输入'2'使用哨兵技术实现方式:");
 23         int temp = myScanner.nextInt();
 24         INSERTION_SORT insertionSort=new INSERTION_SORT();
 25         switch (temp) {
 26         case 1:
 27             //create data
 28             myArrayList=createData.creat();
 29             // get data array
 30             myArray = (int[]) myArrayList.get(0);
 31             // get system's current time
 32             System.out.println("一般插入法排序算法的时间如下:");
 33             // get system's current time again
 34             System.out.println(sdf.format(new Date()));
 35             myArray = insertionSort.insertionSort(myArray);
 36             System.out.println(sdf.format(new Date()));
 37             break;
 38         case 2:
 39             // myArray=(int[]) myArrayList.get(0);因为是地址传递,故这么做不能达到重新编排数据的效果
 40             //create data again
 41             myArrayList=createData.creat();
 42             System.out.println("哨兵插入法排序算法的时间如下:");
 43             System.out.println(sdf.format(new Date()));
 44             myArray = insertionSort.insertionSort_Guard(myArrayList);
 45             System.out.println(sdf.format(new Date()));
 46             break;
 47         default:
 48             System.out.println("error enter!");
 49             break;
 50         }
 51          System.out.println("排序后的数据如下:");
 52          for(int i=0;i<myArray.length;i++){
 53          System.out.print(myArray[i]+" ");
 54          }
 55          System.out.println();
 56          main(null);
 57     }
 58 
 59 }
 60 
 61 // Create Data
 62 class CreateData {
 63     // 产生数据:通过键盘输入来控制输入数据规模和最大值
 64     public ArrayList creat() {
 65         Random myRandom = new Random(1);//通过指定Random seed来产生数列相同的数据,以保证排序时间更好地对比
 66         Scanner scanner = new Scanner(System.in);
 67         System.out.println("请输入生成的数据量:");
 68         int[] myArray = new int[scanner.nextInt()];
 69         // System.out.println(myArray.length);
 70         // 定义哨兵(Sentinel Card)来获取Array中的最小数据和其下标
 71         System.out.println("请输入生成的数据的最大值:");
 72         int stnCd = scanner.nextInt();
 73         final int mixNum = stnCd;
 74         int stnCdSub = 0;
 75         // 对数组进行随机赋值
 76         for (int i = 0; i < myArray.length; i++) {
 77             myArray[i] = myRandom.nextInt(mixNum);// mixNum必须是常量
 78             // 拿到数组中的最小值与其下标
 79             if (stnCd > myArray[i]) {
 80                 stnCd = myArray[i];
 81                 stnCdSub = i;
 82             }
 83         }
 84 
 85         // System.out.println("排序前的数据:");
 86         // for(int i=0;i<myArrayLength;i++){
 87         // System.out.print(myArray[i]+" ");
 88         // }
 89         // System.out.println();
 90         ArrayList returnArrayList = new ArrayList();
 91         returnArrayList.add(0, myArray);
 92         returnArrayList.add(1, stnCd);
 93         returnArrayList.add(2, stnCdSub);
 94         return returnArrayList;
 95     }
 96 }
 97 
 98 // Insertion sort
 99 class INSERTION_SORT {
100     // 插入排序法对数据进行非降排序
101     public int[] insertionSort(int[] myArray) {
102         int key = 0;
103         int j = 0;
104         for (int i = 1; i < myArray.length; i++) {
105             key = myArray[i];
106             for (j = i - 1; j >= 0 && key < myArray[j]; j--) {
107                 myArray[j + 1] = myArray[j];
108             }
109             myArray[j + 1] = key;
110         }
111         return myArray;
112     }
113 
114     // 在“插入排序法”的基础上+“哨兵”
115     public int[] insertionSort_Guard(ArrayList myArrayList) {
116         int[] myArray = (int[]) myArrayList.get(0);
117         int stnCd = (Integer) myArrayList.get(1);
118         int stnCdSub = (Integer) myArrayList.get(2);
119         // 最小值置最前
120         myArray[stnCdSub] = myArray[0];
121         myArray[0] = stnCd;
122         // 进行排序
123         int j = 0;
124         for (int i = 2; i < myArray.length; i++) {
125             stnCd = myArray[i];
126             for (j = i - 1; myArray[j] > stnCd; j--) {
127                 myArray[j + 1] = myArray[j];
128             }
129             myArray[j + 1] = stnCd;
130         }
131         return myArray;
132     }
133 }
134 /*
135  * `output: 请输入生成的数据量: 500000 请输入生成的数据的最大值: 2000 一般插入法排序算法的时间如下: 21:50:58
136  * 21:53:34 请输入生成的数据量: 500000 请输入生成的数据的最大值: 2000 哨兵插入法排序算法的时间如下: 21:55:07
137  * 21:57:12
138  */

 

 

 

posted @ 2013-04-27 10:55  iGeneral  阅读(452)  评论(0编辑  收藏  举报