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 安多 阅读(246) 评论(0)  编辑  收藏 所属分类: 算法

只有注册用户登录后才能发表评论。


网站导航:
 
 
Copyright © 安多 Powered by: 博客园 模板提供:沪江博客