我的“插入算法”实现
这是我的“插入算法”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 */
欢迎转载,欢迎批评指正!
转载请注明:
转自博客园,转载地址:http://www.cnblogs.com/igeneral/