<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 安多 閱讀(271) 評論(0)  編輯  收藏 所屬分類: 算法

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


    網站導航:
     
     
    Copyright © 安多 Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 亚洲一欧洲中文字幕在线| 亚洲av永久无码精品漫画 | 最近中文字幕高清免费中文字幕mv| 国产免费私拍一区二区三区| 亚洲精品宾馆在线精品酒店| 最近中文字幕无吗免费高清| 久久夜色精品国产噜噜亚洲a| 久久精品女人天堂AV免费观看| 国产人成亚洲第一网站在线播放| 大陆一级毛片免费视频观看i| 久久精品国产亚洲av瑜伽| 免费大学生国产在线观看p| 色妞www精品视频免费看| 亚洲国产专区一区| a级男女仿爱免费视频| 久久久无码精品亚洲日韩按摩| 五月婷婷在线免费观看| 亚洲精品无码专区在线| 午夜亚洲福利在线老司机| 精品多毛少妇人妻AV免费久久| 久久亚洲精品成人777大小说| 国产91免费在线观看| 亚洲精品人成网线在线播放va| 免费人成在线观看播放国产| 99久久99这里只有免费的精品| 久久亚洲精品成人av无码网站| 91在线视频免费看| 乱爱性全过程免费视频| 亚洲成Av人片乱码色午夜| 国产大片免费网站不卡美女| MM1313亚洲精品无码久久| 丁香五月亚洲综合深深爱| 91高清免费国产自产拍2021| 亚洲午夜无码久久久久小说 | 亚洲av永久综合在线观看尤物| 国产色爽免费视频| 免费不卡在线观看AV| 国产精品亚洲va在线观看| 亚洲AV无码不卡无码| 四虎永久精品免费观看| 日韩中文字幕免费视频|