andy-j2ee  
          JAVA
          公告
          • 在夜深人靜的時候,偶彈起心愛的土琵琶,唱起那動人的歌謠(柯受良-《大哥》):偶寫了代碼好多年,偶不愛冰冷的床沿,不要逼偶想念,不要逼偶流淚,偶會翻。
          日歷
          <2011年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345
          統計
          • 隨筆 - 19
          • 文章 - 1
          • 評論 - 1
          • 引用 - 0

          導航

          常用鏈接

          留言簿

          隨筆分類(5)

          隨筆檔案(19)

          文章分類(1)

          文章檔案(1)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           
          1 package com.anduo.sort;剛剛在大魚的博客上看到關于排序算法的文章,自己就做了下小實驗,代碼就是自己copy大魚的了。謝謝大魚了。
              首先建好一個排序類,我就命名為Sort了
            1 package com.anduo.sort;
            2 
            3 /*******************************************************************************
            4 * 插入排序:直接插入排序、折半插入排序和系爾排序
            5 * 交換排序:冒泡排序和快速排序
            6 * 選擇排序:簡單選擇排序和堆排序
            7 * 歸并排序:歸并排序
            8 *
            9 * 基本思想
           10 * 插入排序:將第N個記錄插入到前面(N-1)個有序的記錄當中。
           11 * 交換排序:按照某種順序比較兩個記錄的關鍵字大小,然后根據需要交換兩個記錄的位置。
           12 * 選擇排序:根據某種方法選擇一個關鍵字最大的記錄或者關鍵字最小的記錄,放到適當的位置。
           13 *
           14 * 排序方法比較
           15 * 排序方法 平均時間 最壞時間 輔助存儲
           16 * 直接插入排序 O(N2) O(N2) O(1)
           17 * 起泡排序 O(N2) O(N2) O(1)
           18 * 快速排序 O(Nlog2N) O(N2) O(Nlog2N)
           19 * 簡單選擇排序 O(N2) O(N2) O(1)
           20 * 堆排序 O(Nlog2N) O(Nlog2N) O(1)
           21 * 歸并排序 O(Nlog2N) O(Nlog2N) O(n)
           22 * 基數排序 O(d(n+radix)) O(d(n+radix)) O(radix)
           23  * @author anduo
           24  * 
           25  */
           26 public class Sort {
           27 
           28     /***************************************************************************
           29      * 歸并排序法————歸并排序
           30      * 
           31      * @param data
           32      **************************************************************************/
           33     public static void recursionSort(Number[] data) {
           34         Number[] result = merge_sort(data, 0, data.length - 1);
           35         for (int i = 0; i < result.length; i++) {
           36             data[i] = result[i];
           37         }
           38     }
           39 
           40     private static Number[] merge_sort(Number[] array, int start, int end) {
           41         Number[] result = new Number[end - start + 1];
           42         if (start < end) {
           43             int mid = (start + end) / 2;
           44             Number[] left = merge_sort(array, start, mid);
           45             Number[] right = merge_sort(array, mid + 1, end);
           46             result = merge(left, right);
           47         } else if (start == end) {
           48             result[0= array[start];
           49             return result;
           50         }
           51         return result;
           52     }
           53 
           54     private static Number[] merge(Number[] left, Number[] right) {
           55         Number[] result = new Number[left.length + right.length];
           56         int i = 0;
           57         int j = 0;
           58         int k = 0;
           59         while (i < left.length && j < right.length) {
           60             if (left[i].doubleValue() < right[j].doubleValue()) {
           61                 result[k++= left[i++];
           62             } else {
           63                 result[k++= right[j++];
           64             }
           65         }
           66         while (i < left.length) {
           67             result[k++= left[i++];
           68         }
           69         while (j < right.length) {
           70             result[k++= right[j++];
           71         }
           72         return result;
           73     }
           74 
           75     /***************************************************************************
           76      * 選擇排序————堆排序
           77      * 
           78      * @param data
           79      */
           80     public static void heapSort(Number[] data) {
           81         int n = data.length;
           82         for (int i = n / 2; i >= 0; i--) {
           83             keepHeap(data, n, i);
           84         }
           85         while (n > 0) {
           86             swap(data, 0, n - 1);
           87             keepHeap(data, --n, 0);
           88         }
           89     }
           90 
           91     private static void keepHeap(Number[] a, int n, int i) {
           92         Number x = a[i];
           93         int j = 2 * i + 1;
           94         while (j <= n - 1) {
           95             if (j < n - 1 && a[j].doubleValue() < a[j + 1].doubleValue())
           96                 ++j;
           97             if (a[j].doubleValue() > x.doubleValue()) {
           98                 a[i] = a[j];
           99                 i = j;
          100                 j = 2 * i;
          101             } else {
          102                 break;
          103             }
          104         }
          105         a[i] = x;
          106     }
          107 
          108     /***************************************************************************
          109      * 選擇排序————簡單選擇排序
          110      * 
          111      * @param data
          112      **************************************************************************/
          113     public static void selectSort(Number[] data) {
          114         for (int i = 0; i < data.length - 1; i++) {
          115             int smallPoint = i;
          116             for (int j = i + 1; j < data.length; j++) {
          117                 if (data[smallPoint].doubleValue() > data[j].doubleValue()) {
          118                     smallPoint = j;
          119                 }
          120             }
          121             swap(data, i, smallPoint);
          122         }
          123     }
          124 
          125     /***************************************************************************
          126      * 交換排序————快速排序
          127      * 
          128      * @param data
          129      **************************************************************************/
          130     public static void quickSort(Number[] data) {
          131         QuickSort(data, 0, data.length - 1);
          132     }
          133 
          134     private static void QuickSort(Number[] data, int begin, int end) {
          135         if (begin < end) {
          136             // 取中點
          137             int mid = (begin + end) / 2;
          138             if (data[end].doubleValue() < data[begin].doubleValue()) {
          139                 swap(data, end, begin);
          140             }
          141             if (data[end].doubleValue() < data[mid].doubleValue()) {
          142                 swap(data, end, mid);
          143             }
          144             if (data[mid].doubleValue() < data[begin].doubleValue()) {
          145                 swap(data, mid, begin);
          146             }
          147             swap(data, mid, begin);
          148             int min = begin + 1;
          149             int big = end;
          150             while (true) {
          151                 while (min < big
          152                         && data[min].doubleValue() < data[begin].doubleValue()) {
          153                     min++;
          154                 }
          155                 while (min < big
          156                         && data[big].doubleValue() >= data[begin].doubleValue()) {
          157                     big--;
          158                 }
          159                 if (min >= big) {
          160                     break;
          161                 }
          162                 swap(data, min, big);
          163             }
          164             if (data[begin].doubleValue() > data[min].doubleValue()) {
          165                 swap(data, begin, min);
          166             }
          167             if (min > 1)
          168                 QuickSort(data, begin, min - 1);
          169             QuickSort(data, min, end);
          170         }
          171     }
          172 
          173     /***************************************************************************
          174      * 插入排序————希爾排序
          175      * 
          176      * @param data
          177      **************************************************************************/
          178     public static void shellSort(Number[] data) {
          179         int span = data.length / 7;
          180         if (span == 0)
          181             span = 1;
          182         while (span >= 1) {
          183             for (int i = 0; i < span; i++) {
          184                 for (int j = i; j < data.length; j = j + span) {
          185                     // 組內直接插入排序
          186                     int p = j - span;
          187                     Number temp = data[j];
          188                     while (p >= 0 && data[p].doubleValue() > temp.doubleValue()) {
          189                         data[p + span] = data[p];
          190                         p -= span;
          191                     }
          192                     data[p + span] = temp;
          193                 }
          194             }
          195             span = span / 2;
          196         }
          197     }
          198 
          199     /***************************************************************************
          200      * 插入排序————折半插入排序
          201      * 
          202      * @param data
          203      **************************************************************************/
          204     public static void binarySearchSort(Number[] data) {
          205         Number tmp = null;
          206         for (int i = 1; i < data.length; i++) {
          207             tmp = data[i];
          208             int smallpoint = 0;
          209             int bigpoint = i - 1;
          210             while (bigpoint >= smallpoint) {
          211                 int mid = (smallpoint + bigpoint) / 2;
          212                 if (tmp.doubleValue() > data[mid].doubleValue()) {
          213                     smallpoint = mid + 1;
          214                 } else {
          215                     bigpoint = mid - 1;
          216                 }
          217             }
          218             for (int j = i; j > smallpoint; j--) {
          219                 data[j] = data[j - 1];
          220             }
          221             data[bigpoint + 1= tmp;
          222         }
          223     }
          224 
          225     /***************************************************************************
          226      * 插入排序————直接插入排序
          227      * 
          228      * @param data
          229      **************************************************************************/
          230     public static void straightInsertionSort(Number[] data) {
          231         Number tmp = null;
          232         for (int i = 1; i < data.length; i++) {
          233             tmp = data[i];
          234             int j = i - 1;
          235             while (j >= 0 && tmp.doubleValue() < data[j].doubleValue()) {
          236                 data[j + 1= data[j];
          237                 j--;
          238             }
          239             data[j + 1= tmp;
          240         }
          241     }
          242 
          243     /***************************************************************************
          244      * 交換排序-----冒泡排序
          245      * 
          246      * @param data
          247      **************************************************************************/
          248     public static void bulleSort(Number[] data) {
          249         for (int i = 0; i < data.length; i++) {
          250             // 將相鄰兩個數進行比較,較大的數往后冒泡
          251             for (int j = 0; j < data.length - i - 1; j++) {
          252                 if (data[j].doubleValue() > data[j + 1].doubleValue()) {
          253                     // 交換相鄰兩個數
          254                     swap(data, j, j + 1);
          255                 }
          256             }
          257         }
          258     }
          259 
          260     /**
          261      * 交換數組中指定的兩元素的位置
          262      * 
          263      * @param data
          264      * @param x
          265      * @param y
          266      */
          267     private static void swap(Number[] data, int x, int y) {
          268         Number temp = data[x];
          269         data[x] = data[y];
          270         data[y] = temp;
          271     }
          272 }
          273 
              接著開始寫單元測試
                
            1
            
          2 package com.anduo.sort; 
            3 import java.util.ArrayList;
            4 import java.util.Date;
            5 import java.util.List;
            6 
            7 import org.junit.AfterClass;
            8 import org.junit.BeforeClass;
            9 import org.junit.Test;
           10 
           11 public class SortTest {
           12 
           13     private static Number[] data;
           14     private static long beginTime;
           15     private static long endTime;
           16 
           17     private static Integer[] getRundom(long num) {
           18         List<Integer> list = new ArrayList<Integer>();
           19         for (long i = 0; i < num; i++) {
           20             int k;
           21             if (Math.random() > 0.5) {
           22                 k = (int) (Math.random() * Integer.MAX_VALUE);
           23             } else {
           24                 k = (int) (Math.random() * Integer.MIN_VALUE);
           25             }
           26             list.add(k);
           27         }
           28         return list.toArray(new Integer[list.size()]);
           29     }
           30 
           31     @BeforeClass
           32     public static void beforeClass() {
           33         data = getRundom(100000);
           34         System.out.println("----------------------------------------------");
           35     }
           36 
           37     @AfterClass
           38     public static void afterClass() {
           39     }
           40 
           41     @Test
           42     public void testRecursionSort() {
           43         System.out.println("test RecursionSort 遞歸排序");
           44         beginTime = new Date().getTime();
           45         Sort.recursionSort(data);
           46         endTime = new Date().getTime();
           47         System.out.println(endTime - beginTime);
           48         System.out.println("----------------------------------------------");
           49     }
           50 
           51     @Test
           52     public void testHeapSort() {
           53         System.out.println("test HeapSort 堆排序");
           54         beginTime = new Date().getTime();
           55         Sort.heapSort(data);
           56         endTime = new Date().getTime();
           57         System.out.println(endTime - beginTime);
           58         System.out.println("----------------------------------------------");
           59     }
           60 
           61     @Test
           62     public void testQuickSort() {
           63         System.out.println("test QuickSort 快速排序");
           64         beginTime = new Date().getTime();
           65         Sort.quickSort(data);
           66         endTime = new Date().getTime();
           67         System.out.println(endTime - beginTime);
           68         System.out.println("----------------------------------------------");
           69     }
           70 
           71     @Test
           72     public void testShellSort() {
           73         System.out.println("test ShellSort 希爾排序");
           74         beginTime = new Date().getTime();
           75         Sort.shellSort(data);
           76         endTime = new Date().getTime();
           77         System.out.println(endTime - beginTime);
           78         System.out.println("----------------------------------------------");
           79     }
           80 
           81     @Test
           82     public void testBinarySearchSort() {
           83         System.out.println("test BinarySearchSort 二分搜索排序");
           84         beginTime = new Date().getTime();
           85         Sort.binarySearchSort(data);
           86         endTime = new Date().getTime();
           87         System.out.println(endTime - beginTime);
           88         System.out.println("----------------------------------------------");
           89     }
           90 
           91     @Test
           92     public void testStraightInsertionSort() {
           93         System.out.println("test StraightInsertionSort 直接插入排序");
           94         beginTime = new Date().getTime();
           95         Sort.straightInsertionSort(data);
           96         endTime = new Date().getTime();
           97         System.out.println(endTime - beginTime);
           98         System.out.println("----------------------------------------------");
           99     }
          100 
          101     @Test
          102     public void testBulleSort() {
          103         System.out.println("test BulleSort 冒泡排序");
          104         beginTime = new Date().getTime();
          105         Sort.bulleSort(data);
          106         endTime = new Date().getTime();
          107         System.out.println(endTime - beginTime);
          108         System.out.println("----------------------------------------------");
          109     }
          110 
          111     @Test
          112     public void testSelectSort() {
          113         System.out.println("test SelectSort 選擇排序");
          114         beginTime = new Date().getTime();
          115         Sort.selectSort(data);
          116         endTime = new Date().getTime();
          117         System.out.println(endTime - beginTime);
          118         System.out.println("----------------------------------------------");
          119     }
          120 
          121 }
          122 
             排序的結構我就不公布了。我大概試了一下最快的應該是自己插入排序吧。冒泡最慢。。。。。。。
          posted on 2011-10-07 20:34 安多 閱讀(276) 評論(0)  編輯  收藏 所屬分類: 算法

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
           
          Copyright © 安多 Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 内江市| 长乐市| 龙胜| 宜春市| 满洲里市| 东乡族自治县| 鸡东县| 资溪县| 清水县| 嘉祥县| 得荣县| 屯昌县| 九龙城区| 芷江| 平和县| 沽源县| 沁水县| 长子县| 文化| 阳曲县| 策勒县| 德钦县| 蓝山县| 繁昌县| 陈巴尔虎旗| 台南县| 章丘市| 榆社县| 贵定县| 修水县| 岑巩县| 宜黄县| 岗巴县| 大名县| 钦州市| 措勤县| 湘西| 温宿县| 伽师县| 天气| 图们市|