大魚

          排序算法java版,速度排行:冒泡排序、簡(jiǎn)單選擇排序、直接插入排序、折半插入排序、希爾排序、堆排序、歸并排序、快速排序

          先推薦一篇關(guān)于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html

          本文思路部分來(lái)源于上篇文章,但測(cè)得的結(jié)果似乎不大相同,不知是因?yàn)閖ava的緣故還是因?yàn)槲宜惴ǖ木壒剩瑲g迎拍磚。

          復(fù)習(xí)排序,順便比下各種算法的速度,榜單如下:

          1、冒泡排序

          2、簡(jiǎn)單選擇排序

          3、直接插入排序

          4、折半插入排序

          5、希爾排序

          6、堆排序

          7、歸并排序

          8、快速排序

          當(dāng)然這是慢速排行,哈哈~~

          直接上圖:?jiǎn)挝缓撩?/p>

          數(shù)量

          冒泡排序

          簡(jiǎn)單選擇排序

          直接插入排序

          折半插入排序

          希爾排序

          堆排序

          歸并排序

          快速排序

          10000個(gè)

          1578

          1250

          672

          250

          0

          15

          16

          0

          15000個(gè)

          3453

          2765

          1563

          531

          16

          15

          16

          0

          20000個(gè)

          6140

          4547

          2453

          828

          16

          16

          15

          16

          25000個(gè)

          10079

          7171

          3969

          1313

          31

          16

          15

          16

          30000個(gè)

          14641

          10313

          5578

          1906

          31

          31

          16

          31

          35000個(gè)

          20141

          14328

          7890

          2563

          31

          31

          32

          15

          40000個(gè)

          25766

          18359

          10094

          3422

          47

          31

          31

          32

          45000個(gè)

          32469

          24063

          13062

          4359

          47

          47

          31

          47

          由于"希爾排序","堆排序","歸并排序","快速排序"太快,以至于在上圖幾乎是條直線,故有了下面轉(zhuǎn)為他們準(zhǔn)備的加強(qiáng)版

          數(shù)量

          希爾排序

          堆排序

          歸并排序

          快速排序

          100000個(gè)

          172

          140

          110

          93

          200000個(gè)

          469

          406

          235

          234

          300000個(gè)

          812

          703

          422

          375

          400000個(gè)

          1125

          1031

          516

          531

          500000個(gè)

          1406

          1282

          719

          656

          600000個(gè)

          1828

          1703

          860

          859

          700000個(gè)

          2531

          2063

          1000

          968

          800000個(gè)

          2735

          2453

          1140

          1188

          900000個(gè)

          3047

          2843

          1391

          1266

          1000000個(gè)

          3375

          3187

          1516

          1422

          1100000個(gè)

          3922

          3500

          1625

          1609

          1200000個(gè)

          4421

          3954

          1969

          1812

          1300000個(gè)

          4797

          4422

          2000

          1953

          1400000個(gè)

          5391

          4797

          2547

          2094

          1500000個(gè)

          5437

          5219

          2625

          2328

          1600000個(gè)

          6203

          5546

          2469

          2485

          1700000個(gè)

          6532

          5953

          2844

          2672

          1800000個(gè)

          7125

          6421

          2984

          2844

          補(bǔ)上代碼:

          Java代碼 收藏代碼
          1. import java.util.ArrayList;
          2. import java.util.Arrays;
          3. import java.util.List;
          4. /**
          5. * 插入排序:直接插入排序、折半插入排序和系爾排序
          6. * 交換排序:冒泡排序和快速排序
          7. * 選擇排序:簡(jiǎn)單選擇排序和堆排序
          8. * 歸并排序:歸并排序
          9. *
          10. * 基本思想
          11. * 插入排序:將第N個(gè)記錄插入到前面(N-1)個(gè)有序的記錄當(dāng)中。
          12. * 交換排序:按照某種順序比較兩個(gè)記錄的關(guān)鍵字大小,然后根據(jù)需要交換兩個(gè)記錄的位置。
          13. * 選擇排序:根據(jù)某種方法選擇一個(gè)關(guān)鍵字最大的記錄或者關(guān)鍵字最小的記錄,放到適當(dāng)?shù)奈恢谩?/span>
          14. *
          15. * 排序方法比較
          16. * 排序方法 平均時(shí)間 最壞時(shí)間 輔助存儲(chǔ)
          17. * 直接插入排序 O(N2) O(N2) O(1)
          18. * 起泡排序 O(N2) O(N2) O(1)
          19. * 快速排序 O(Nlog2N) O(N2) O(Nlog2N)
          20. * 簡(jiǎn)單選擇排序 O(N2) O(N2) O(1)
          21. * 堆排序 O(Nlog2N) O(Nlog2N) O(1)
          22. * 歸并排序 O(Nlog2N) O(Nlog2N) O(n)
          23. * 基數(shù)排序 O(d(n+radix)) O(d(n+radix)) O(radix)
          24. *
          25. *
          26. *
          27. * @author Administrator
          28. *
          29. */
          30. public class SortTest {
          31. public static void main(String[] args)throws Exception {
          32. //測(cè)試排序是否正確
          33. //String[] testErr=new String[]{"冒泡排序","簡(jiǎn)單選擇排序","直接插入排序","折半插入排序","系爾排序","堆排序","歸并排序","快速排序"};
          34. //new SortTest().testErr(testErr);
          35. //排序1(全部)
          36. String[] strs=new String[]{"冒泡排序","簡(jiǎn)單選擇排序","直接插入排序","折半插入排序","希爾排序","堆排序","歸并排序","快速排序"};
          37. new SortTest().test(strs,10000,50000,5000);
          38. //排序2(加強(qiáng))
          39. String[] strs2=new String[]{"希爾排序","堆排序","歸并排序","快速排序"};
          40. new SortTest().test(strs2,100000,1900000,100000);
          41. }
          42. private void testErr(String[] strings) throws Exception{
          43. //System.out.println(Arrays.toString(old));
          44. System.out.println(Arrays.toString(strings));
          45. Number[] old=getRundom(50);
          46. 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};
          47. old=oo;
          48. for(String s:strings){
          49. Number[] testNum=Arrays.copyOf(old, old.length);
          50. long begin=System.currentTimeMillis();
          51. SortTest.class.getMethod(s, Number[].class).invoke(this, (Object)testNum);
          52. long end=System.currentTimeMillis();
          53. System.out.println(s+":"+(end-begin)+"\t");
          54. System.out.println(Arrays.toString(testNum));
          55. }
          56. System.out.println();
          57. }
          58. private void test(String[] strings,long begin,long end,long step) throws Exception{
          59. System.out.print("數(shù)量\t");
          60. for(String str:strings){
          61. System.out.print(str+"\t");
          62. }
          63. System.out.println();
          64. for(long i=begin;i<end;i=i+step){
          65. System.out.print(i+"個(gè)\t");
          66. Number[] old=getRundom(i);
          67. for(String s:strings){
          68. Number[] testNum=Arrays.copyOf(old, old.length);
          69. long beginTime=System.currentTimeMillis();
          70. SortTest.class.getMethod(s, Number[].class).invoke(this, (Object)testNum);
          71. long endTime=System.currentTimeMillis();
          72. System.out.print((endTime-beginTime)+"\t");
          73. //System.out.println(Arrays.toString(testNum));
          74. }
          75. System.out.println();
          76. }
          77. }
          78. private static Integer[] getRundom(long num) {
          79. List<Integer> list=new ArrayList<Integer>();
          80. for(long i=0;i<num;i++){
          81. int k;
          82. if(Math.random()>0.5){
          83. k=(int)(Math.random()*Integer.MAX_VALUE);
          84. }else{
          85. k=(int)(Math.random()*Integer.MIN_VALUE);
          86. }
          87. list.add(k);
          88. }
          89. return list.toArray(new Integer[list.size()]);
          90. }
          91. /**
          92. * 插入排序————直接插入排序
          93. * @param data
          94. */
          95. public static void 直接插入排序(Number[] data)
          96. {
          97. Number tmp=null ;
          98. for(int i=1;i<data.length;i++){
          99. tmp = data[i];
          100. int j=i-1;
          101. while(j>=0 && tmp.doubleValue()<data[j].doubleValue()){
          102. data[j+1]=data[j];
          103. j--;
          104. }
          105. data[j+1]=tmp;
          106. }
          107. }
          108. /**
          109. * 插入排序————折半插入排序
          110. * @param data
          111. */
          112. public static void 折半插入排序(Number[] data)
          113. {
          114. Number tmp=null ;
          115. for(int i=1;i<data.length;i++){
          116. tmp = data[i];
          117. int smallpoint=0;
          118. int bigpoint=i-1;
          119. while(bigpoint>=smallpoint){
          120. int mid=(smallpoint+bigpoint)/2;
          121. if(tmp.doubleValue()>data[mid].doubleValue()){
          122. smallpoint=mid+1;
          123. }else{
          124. bigpoint=mid-1;
          125. }
          126. }
          127. for(int j=i;j>smallpoint;j--){
          128. data[j]=data[j-1];
          129. }
          130. data[bigpoint+1]=tmp;
          131. }
          132. }
          133. /**
          134. * 插入排序————希爾排序
          135. * @param data
          136. */
          137. public static void 希爾排序(Number[] data)
          138. {
          139. int span=data.length/7;
          140. if(span==0)span=1;
          141. while(span>=1){
          142. for(int i=0;i<span;i++){
          143. for(int j=i;j<data.length;j=j+span){
          144. //組內(nèi)直接插入排序
          145. int p = j-span;
          146. Number temp = data[j];
          147. while( p >=0 && data[p].doubleValue() > temp.doubleValue()){
          148. data[p+span] = data[p];
          149. p -=span;
          150. }
          151. data[p + span] = temp;
          152. }
          153. }
          154. span=span/2;
          155. }
          156. }
          157. /**
          158. * 交換排序————冒泡排序
          159. *
          160. * @param data
          161. */
          162. public static void 冒泡排序(Number[] data)
          163. {
          164. for (int i = 0; i < data.length; i++) {
          165. //將相鄰兩個(gè)數(shù)進(jìn)行比較,較大的數(shù)往后冒泡
          166. for (int j = 0; j < data.length - i-1; j++) {
          167. if (data[j].doubleValue()> data[j + 1].doubleValue()) {
          168. //交換相鄰兩個(gè)數(shù)
          169. swap(data, j, j + 1);
          170. }
          171. }
          172. }
          173. }
          174. /**
          175. * 交換排序————快速排序
          176. * @param data
          177. */
          178. public static void 快速排序(Number[] data)
          179. {
          180. QuickSort(data,0,data.length-1);
          181. }
          182. private static void QuickSort(Number[] data, int begin, int end) {
          183. // System.out.println(begin+":"+end);
          184. if(begin<end){
          185. //取中點(diǎn)
          186. int mid=(begin+end)/2;
          187. if(data[end].doubleValue()<data[begin].doubleValue()){
          188. swap(data, end, begin);
          189. }
          190. if(data[end].doubleValue()<data[mid].doubleValue()){
          191. swap(data, end, mid);
          192. }
          193. if(data[mid].doubleValue()<data[begin].doubleValue()){
          194. swap(data, mid, begin);
          195. }
          196. swap(data, mid, begin);
          197. // System.out.println(Arrays.toString(Arrays.copyOfRange(data, begin, end)) );
          198. int min=begin+1;
          199. int big=end;
          200. while(true){
          201. while(min<big && data[min].doubleValue()<data[begin].doubleValue()){min++;}
          202. while(min<big && data[big].doubleValue()>=data[begin].doubleValue()){big--;}
          203. if(min>=big){
          204. break;
          205. }
          206. swap(data, min, big);
          207. }
          208. if(data[begin].doubleValue()>data[min].doubleValue()){
          209. swap(data, begin, min);
          210. }
          211. if(min>1)
          212. QuickSort(data,begin,min-1);
          213. //if(min<end)
          214. QuickSort(data,min,end);
          215. }
          216. }
          217. /**
          218. * 選擇排序————簡(jiǎn)單選擇排序
          219. * @param data
          220. */
          221. public static void 簡(jiǎn)單選擇排序(Number[] data)
          222. {
          223. for (int i = 0; i < data.length-1; i++) {
          224. int smallPoint=i;
          225. for (int j = i+1; j < data.length; j++) {
          226. if (data[smallPoint].doubleValue()> data[j].doubleValue()) {
          227. smallPoint=j;
          228. }
          229. }
          230. swap(data, i, smallPoint);
          231. }
          232. }
          233. /**
          234. * 選擇排序————堆排序
          235. * @param data
          236. */
          237. public static void 堆排序(Number[] data)
          238. {
          239. int n = data.length;
          240. for(int i=n/2;i>=0;i--){
          241. keepHeap(data, n, i);
          242. }
          243. while (n > 0) {
          244. swap(data, 0, n-1);
          245. keepHeap(data, --n, 0);
          246. }
          247. }
          248. private static void keepHeap(Number[] a, int n, int i) {
          249. Number x = a[i];
          250. int j = 2 * i + 1;
          251. while (j <= n - 1) {
          252. if (j < n - 1 && a[j].doubleValue() < a[j + 1].doubleValue())
          253. ++j;
          254. if (a[j].doubleValue() > x.doubleValue()) {
          255. a[i] = a[j];
          256. i = j;
          257. j = 2 * i ;
          258. } else{
          259. break;
          260. }
          261. }
          262. a[i] = x;
          263. }
          264. /**
          265. * 歸并排序法————歸并排序
          266. * @param data
          267. */
          268. public static void 歸并排序(Number[] data)
          269. {
          270. Number[] result = merge_sort(data,0,data.length-1);
          271. for(int i=0;i<result.length;i++){
          272. data[i]=result[i];
          273. }
          274. }
          275. private static Number[] merge_sort(Number[] array, int start, int end){
          276. Number[] result = new Number[end-start+1];
          277. if(start< end){
          278. int mid= (start+end)/2;
          279. Number[] left= merge_sort(array, start, mid);
          280. Number[] right = merge_sort(array, mid+1, end);
          281. result= merge(left,right);
          282. } else if (start == end) {
          283. result[0] = array[start];
          284. return result;
          285. }
          286. return result;
          287. }
          288. private static Number[] merge(Number[] left, Number[] right) {
          289. Number[] result = new Number[left.length+right.length];
          290. int i=0;
          291. int j=0;
          292. int k=0;
          293. while(i< left.length&&j< right.length){
          294. if(left[i].doubleValue()< right[j].doubleValue()){
          295. result[k++] = left[i++];
          296. }else{
          297. result[k++] = right[j++];
          298. }
          299. }
          300. while(i< left.length){
          301. result[k++] = left[i++];
          302. }
          303. while (j< right.length) {
          304. result[k++]= right[j++];
          305. }
          306. return result;
          307. }
          308. /**
          309. * 交換數(shù)組中指定的兩元素的位置
          310. * @param data
          311. * @param x
          312. * @param y
          313. */
          314. private static void swap(Number[] data, int x, int y) {
          315. Number temp = data[x];
          316. data[x] = data[y];
          317. data[y] = temp;
          318. }
          319. }

          posted on 2011-10-06 23:34 大魚 閱讀(835) 評(píng)論(1)  編輯  收藏 所屬分類: 軟件工程

          評(píng)論

          # re: 排序算法java版,速度排行:冒泡排序、簡(jiǎn)單選擇排序、直接插入排序、折半插入排序、希爾排序、堆排序、歸并排序、快速排序 2011-10-07 19:35 安多

          收藏了  回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 石屏县| 涪陵区| 普安县| 方山县| 长岛县| 永清县| 遂平县| 云南省| 通榆县| 浮梁县| 长武县| 西峡县| 宜都市| 新田县| 衡阳县| 大英县| 荆州市| 抚顺县| 福安市| 甘南县| 陵水| 石首市| 大同市| 木里| 利川市| 曲沃县| 景宁| 通许县| 乐平市| 呈贡县| 锡林浩特市| 奈曼旗| 老河口市| 双鸭山市| 广德县| 长兴县| 苍溪县| 筠连县| 卓尼县| 贵州省| 留坝县|