排序算法java版

转 http://www.blogjava.net/luluyanglu/archive/2011/10/07/360090.html

本文思路部分来源于上篇文章,但测得的结果似乎不大相同,不知是因为java的缘故还是因为我算法的缘故,欢迎拍砖。

复习排序,顺便比下各种算法的速度,榜单如下:

1、冒泡排序

2、简单选择排序

3、直接插入排序

4、折半插入排序

5、希尔排序

6、堆排序

7、归并排序

8、快速排序

不稳定:快速排序,希尔排序,堆排序。


当然这是慢速排行,哈哈~~

直接上图:单位毫秒

数量

冒泡排序

简单选择排序

直接插入排序

折半插入排序

希尔排序

堆排序

归并排序

快速排序

10000

1578

1250

672

250

0

15

16

0

15000

3453

2765

1563

531

16

15

16

0

20000

6140

4547

2453

828

16

16

15

16

25000

10079

7171

3969

1313

31

16

15

16

30000

14641

10313

5578

1906

31

31

16

31

35000

20141

14328

7890

2563

31

31

32

15

40000

25766

18359

10094

3422

47

31

31

32

45000

32469

24063

13062

4359

47

47

31

47

由于"希尔排序","堆排序","归并排序","快速排序"太快,以至于在上图几乎是条直线,故有了下面转为他们准备的加强版

数量

希尔排序

堆排序

归并排序

快速排序

100000

172

140

110

93

200000

469

406

235

234

300000

812

703

422

375

400000

1125

1031

516

531

500000

1406

1282

719

656

600000

1828

1703

860

859

700000

2531

2063

1000

968

800000

2735

2453

1140

1188

900000

3047

2843

1391

1266

1000000

3375

3187

1516

1422

1100000

3922

3500

1625

1609

1200000

4421

3954

1969

1812

1300000

4797

4422

2000

1953

1400000

5391

4797

2547

2094

1500000

5437

5219

2625

2328

1600000

6203

5546

2469

2485

1700000

6532

5953

2844

2672

1800000

7125

6421

2984

2844

补上代码:

Java代码 收藏代码
  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.List;

  4. public class SortTest {

  5. public static void main(String[] args)throws Exception {
  6. //测试排序是否正确
  7. //String[] testErr=new String[]{"冒泡排序","简单选择排序","直接插入排序","折半插入排序","系尔排序","堆排序","归并排序","快速排序"};
  8. //new SortTest().testErr(testErr);

  9. //排序1(全部)
  10. String[] strs=new String[]{"冒泡排序","简单选择排序","直接插入排序","折半插入排序","希尔排序","堆排序","归并排序","快速排序"};
  11. new SortTest().test(strs,10000,50000,5000);

  12. //排序2(加强)
  13. String[] strs2=new String[]{"希尔排序","堆排序","归并排序","快速排序"};
  14. new SortTest().test(strs2,100000,1900000,100000);

  15. }
  16. private void testErr(String[] strings) throws Exception{

  17. //System.out.println(Arrays.toString(old));
  18. System.out.println(Arrays.toString(strings));

  19. Number[] old=getRundom(50);
  20. Integer[] oo={1,2,3,3,2,21,5,6,7,78,5,65,8,7,6,6,6,6,6,9,56544,354,32,4,456,8,89,-9,0,3,243,-321,321,-3,-2,21};
  21. old=oo;
  22. for(String s:strings){
  23. Number[] testNum=Arrays.copyOf(old, old.length);
  24. long begin=System.currentTimeMillis();
  25. SortTest.class.getMethod(s, Number[].class).invoke(this, (Object)testNum);

  26. long end=System.currentTimeMillis();
  27. System.out.println(s+":"+(end-begin)+"\t");
  28. System.out.println(Arrays.toString(testNum));
  29. }
  30. System.out.println();


  31. }

  32. private void test(String[] strings,long begin,long end,long step) throws Exception{
  33. System.out.print("数量\t");
  34. for(String str:strings){
  35. System.out.print(str+"\t");
  36. }
  37. System.out.println();
  38. for(long i=begin;i
  39. System.out.print(i+"个\t");
  40. Number[] old=getRundom(i);
  41. for(String s:strings){
  42. Number[] testNum=Arrays.copyOf(old, old.length);
  43. long beginTime=System.currentTimeMillis();
  44. SortTest.class.getMethod(s, Number[].class).invoke(this, (Object)testNum);

  45. long endTime=System.currentTimeMillis();
  46. System.out.print((endTime-beginTime)+"\t");
  47. //System.out.println(Arrays.toString(testNum));
  48. }
  49. System.out.println();
  50. }

  51. }

  52. private static Integer[] getRundom(long num) {
  53. List list=new ArrayList();
  54. for(long i=0;i
  55. int k;
  56. if(Math.random()>0.5){
  57. k=(int)(Math.random()*Integer.MAX_VALUE);
  58. }else{
  59. k=(int)(Math.random()*Integer.MIN_VALUE);
  60. }
  61. list.add(k);
  62. }
  63. return list.toArray(new Integer[list.size()]);
  64. }




  65. public static void 直接插入排序(Number[] data)
  66. {
  67. Number tmp=null ;

  68. for(int i=1;i
  69. tmp = data[i];
  70. int j=i-1;
  71. while(j>=0 && tmp.doubleValue()
  72. data[j+1]=data[j];
  73. j--;
  74. }
  75. data[j+1]=tmp;
  76. }
  77. }
  78. public static void 折半插入排序(Number[] data)
  79. {
  80. Number tmp=null ;
  81. for(int i=1;i
  82. tmp = data[i];
  83. int smallpoint=0;
  84. int bigpoint=i-1;

  85. while(bigpoint>=smallpoint){
  86. int mid=(smallpoint+bigpoint)/2;
  87. if(tmp.doubleValue()>data[mid].doubleValue()){
  88. smallpoint=mid+1;
  89. }else{
  90. bigpoint=mid-1;
  91. }
  92. }
  93. for(int j=i;j>smallpoint;j--){
  94. data[j]=data[j-1];
  95. }
  96. data[bigpoint+1]=tmp;
  97. }
  98. }

  99. public static void 希尔排序(Number[] data)
  100. {
  101. int span=data.length/7;
  102. if(span==0)span=1;
  103. while(span>=1){
  104. for(int i=0;i
  105. for(int j=i;j
  106. //组内直接插入排序
  107. int p = j-span;
  108. Number temp = data[j];
  109. while( p >=0 && data[p].doubleValue() > temp.doubleValue()){
  110. data[p+span] = data[p];
  111. p -=span;
  112. }
  113. data[p + span] = temp;
  114. }
  115. }
  116. span=span/2;
  117. }


  118. }

  119. public static void 冒泡排序(Number[] data)
  120. {
  121. for (int i = 0; i < data.length; i++) {
  122. //将相邻两个数进行比较,较大的数往后冒泡
  123. for (int j = 0; j < data.length - i-1; j++) {
  124. if (data[j].doubleValue()> data[j + 1].doubleValue()) {
  125. //交换相邻两个数
  126. swap(data, j, j + 1);
  127. }
  128. }
  129. }
  130. }
  131. public static void 快速排序(Number[] data)
  132. {
  133. QuickSort(data,0,data.length-1);
  134. }

  135. private static void QuickSort(Number[] data, int begin, int end) {
  136. // System.out.println(begin+":"+end);
  137. if(begin
  138. //取中点
  139. int mid=(begin+end)/2;
  140. if(data[end].doubleValue()
  141. swap(data, end, begin);
  142. }
  143. if(data[end].doubleValue()
  144. swap(data, end, mid);
  145. }
  146. if(data[mid].doubleValue()
  147. swap(data, mid, begin);
  148. }

  149. swap(data, mid, begin);

  150. // System.out.println(Arrays.toString(Arrays.copyOfRange(data, begin, end)) );
  151. int min=begin+1;
  152. int big=end;

  153. while(true){
  154. while(min
  155. while(min=data[begin].doubleValue()){big--;}
  156. if(min>=big){
  157. break;
  158. }
  159. swap(data, min, big);
  160. }
  161. if(data[begin].doubleValue()>data[min].doubleValue()){
  162. swap(data, begin, min);
  163. }

  164. if(min>1)
  165. QuickSort(data,begin,min-1);
  166. //if(min
  167. QuickSort(data,min,end);
  168. }
  169. }
  170. public static void 简单选择排序(Number[] data)
  171. {
  172. for (int i = 0; i < data.length-1; i++) {
  173. int smallPoint=i;
  174. for (int j = i+1; j < data.length; j++) {
  175. if (data[smallPoint].doubleValue()> data[j].doubleValue()) {
  176. smallPoint=j;
  177. }
  178. }
  179. swap(data, i, smallPoint);
  180. }

  181. }

  182. public static void 堆排序(Number[] data)
  183. {

  184. int n = data.length;
  185. for(int i=n/2;i>=0;i--){
  186. keepHeap(data, n, i);
  187. }
  188. while (n > 0) {
  189. swap(data, 0, n-1);
  190. keepHeap(data, --n, 0);
  191. }
  192. }


  193. private static void keepHeap(Number[] a, int n, int i) {
  194. Number x = a[i];
  195. int j = 2 * i + 1;
  196. while (j <= n - 1) {
  197. if (j < n - 1 && a[j].doubleValue() < a[j + 1].doubleValue())
  198. ++j;
  199. if (a[j].doubleValue() > x.doubleValue()) {
  200. a[i] = a[j];
  201. i = j;
  202. j = 2 * i ;
  203. } else{
  204. break;
  205. }
  206. }
  207. a[i] = x;
  208. }




  209. public static void 归并排序(Number[] data)
  210. {
  211. Number[] result = merge_sort(data,0,data.length-1);
  212. for(int i=0;i
  213. data[i]=result[i];
  214. }
  215. }
  216. private static Number[] merge_sort(Number[] array, int start, int end){
  217. Number[] result = new Number[end-start+1];
  218. if(start< end){
  219. int mid= (start+end)/2;
  220. Number[] left= merge_sort(array, start, mid);
  221. Number[] right = merge_sort(array, mid+1, end);
  222. result= merge(left,right);
  223. } else if (start == end) {
  224. result[0] = array[start];
  225. return result;
  226. }
  227. return result;
  228. }
  229. private static Number[] merge(Number[] left, Number[] right) {
  230. Number[] result = new Number[left.length+right.length];
  231. int i=0;
  232. int j=0;
  233. int k=0;
  234. while(i< left.length&&j< right.length){
  235. if(left[i].doubleValue()< right[j].doubleValue()){
  236. result[k++] = left[i++];
  237. }else{
  238. result[k++] = right[j++];

  239. }
  240. }
  241. while(i< left.length){
  242. result[k++] = left[i++];
  243. }
  244. while (j< right.length) {
  245. result[k++]= right[j++];
  246. }
  247. return result;
  248. }

  249. private static void swap(Number[] data, int x, int y) {
  250. Number temp = data[x];
  251. data[x] = data[y];
  252. data[y] = temp;
  253. }
  254. }
posted @ 2014-10-22 13:55  Wishmeluck  阅读(183)  评论(0编辑  收藏  举报