這是我的“插入演算法”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:58136 * 21:53:34 請輸入產生的資料量: 500000 請輸入產生的資料的最大值: 2000 哨兵插入法排序演算法的時間如下: 21:55:07137 * 21:57:12138 */