当前位置: 首页 > 编程日记 > 正文

排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序...

先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.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. /**
  5. * 插入排序:直接插入排序、折半插入排序和系尔排序
  6. * 交换排序:冒泡排序和快速排序
  7. * 选择排序:简单选择排序和堆排序
  8. * 归并排序:归并排序
  9. *
  10. * 基本思想
  11. * 插入排序:将第N个记录插入到前面(N-1)个有序的记录当中。
  12. * 交换排序:按照某种顺序比较两个记录的关键字大小,然后根据需要交换两个记录的位置。
  13. * 选择排序:根据某种方法选择一个关键字最大的记录或者关键字最小的记录,放到适当的位置。
  14. *
  15. * 排序方法比较
  16. * 排序方法         平均时间        最坏时间         辅助存储
  17. * 直接插入排序      O(N2)          O(N2)           O(1)
  18. * 起泡排序         O(N2)          O(N2)           O(1)
  19. * 快速排序         O(Nlog2N)      O(N2)           O(Nlog2N)
  20. * 简单选择排序      O(N2)          O(N2)           O(1)
  21. * 堆排序           O(Nlog2N)      O(Nlog2N)       O(1)
  22. * 归并排序         O(Nlog2N)      O(Nlog2N)       O(n)
  23. * 基数排序         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. //测试排序是否正确
  33. //String[] testErr=new String[]{"冒泡排序","简单选择排序","直接插入排序","折半插入排序","系尔排序","堆排序","归并排序","快速排序"};
  34. //new SortTest().testErr(testErr);
  35. //排序1(全部)
  36. String[] strs=new String[]{"冒泡排序","简单选择排序","直接插入排序","折半插入排序","希尔排序","堆排序","归并排序","快速排序"};
  37. new SortTest().test(strs,10000,50000,5000);
  38. //排序2(加强)
  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("数量\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+"个\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. //组内直接插入排序
  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. //将相邻两个数进行比较,较大的数往后冒泡
  166. for (int j = 0; j < data.length - i-1; j++) {
  167. if (data[j].doubleValue()> data[j + 1].doubleValue()) {
  168. //交换相邻两个数
  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. //取中点
  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. * 选择排序————简单选择排序
  219. * @param data
  220. */
  221. public static void  简单选择排序(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. * 交换数组中指定的两元素的位置
  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. }

转载于:https://www.cnblogs.com/ericsun/archive/2013/05/31/3110148.html

相关文章:

项目存档管理规范

项目存档管理规范 在我们开发过很多个项目之后&#xff0c;每个项目都会累积下很多源码、文档等&#xff0c;查找和整理起来很不方便&#xff0c;如果我们又要同时工作于多个项目的话&#xff0c;情况会更糟。所以对每个项目的各种档案进行有效管理很有必要&#xff0c;从公司层…

review what i studied `date` - 2017-4-12

python 连接字符串 int srt >>> a 1 >>> b xuhui >>> a b Traceback (most recent call last):File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for : int and str >>> b str(a)…

StaticFactoryMethod_Level1

以下代码是“简单工厂模式”的第一个例子&#xff1a;

逃离深圳,一个程序员的选择

到新公司上班也已经一个多月了&#xff0c;上周刚刚交了首付&#xff0c;总价50多万&#xff0c;97个平方的房子还外送8个平方。为了不忘记这次的选择&#xff0c;也为了记录这次选择的过程&#xff0c;特撰文如下。 自从得知老婆怀孕后&#xff0c;那是相当高兴&#xff0c;但…

弹出窗口(对话框)

对话框分为三种&#xff1a;window.open方法 无模式对话框 有模式对话框 第一&#xff1a;OPEN方法 <script>functionopen_cate(){ window.open("OpenUp.aspx","","toolbar0,location0,directories0,status0, menubar0,scr…

隐藏系统保留区

为了下午的装机活动自己就安了一个老毛桃&#xff0c;制作启动盘完毕后发现电脑中的“系统保留”盘出来了&#xff0c;为什么会出现这个盘呢&#xff1f; 当笔记本安装Windows7系统时会自己主动产生一个几百兆的系统保留分区。里面保存着系统/磁盘引导的数据。有些笔记本在出厂…

StaticFactoryMethod_Level2

以下代码是“简单工厂模式”的第二个例子&#xff1a;

06- web兼容性测试

稍后更新。。转载于:https://www.cnblogs.com/Chamberlain/p/11064664.html

話說我們家姚明

已經讀三年級了,成績不錯,有目共睹!最近三場比賽連續三次得分在30分以上...呵呵~在NBA那個高手如雲的地方如此出色! ^_^#好強~ 真的好強!!麥迪那個軟蛋,干脆把他賣掉得了!拿高工資不做事的人.. 凸-_-转载于:https://www.cnblogs.com/tohen/archive/2006/03/09/346286.html

20145240《网络对抗》MSF基础应用

MSF基础应用 一个主动攻击&#xff0c;如ms08_067 启动msfsearch ms08_067&#xff0c;查找相应的漏洞&#xff0c;查询可攻击的模块。根据上述漏洞的模块use exploit/windows/smb/ms08_067_netapi选择该模块接下来查看相应的攻击载荷&#xff0c;首先我们可以查看可使用的载荷…

StaticFactoryMethod_Level3

以下代码是“简单工厂模式”的第三个例子&#xff1a;

Dynamics CRM 导入用户数据错误 could not retrieve salesperson role

在CRM中通过导入数据的方式创建用户时报下图中的错误&#xff0c;“could not retrieve saleperson role”。原因是系统中的自带的salesperson安全角色被删除了&#xff0c;在用导入数据的方式导入文档新建用户时是没有安全角色让你选择的&#xff0c;系统默认给分派了销售员的…

也许这样叫做成熟

早上想坐早班车来接三日游回来的佳&#xff0c;不料还是比旅游团的车晚一步&#xff0c;不过今天到……小结&#xff1a;1、做事&#xff0c;大事不糊涂&#xff0c;小事灵活受理&#xff1b;2、目标明确&#xff0c;善始善终&#xff1b;3、卧薪尝胆&#xff0c;体味时间的诅咒…

写文章 TEE技术分析【转】

转自&#xff1a;https://zhuanlan.zhihu.com/p/24222064 首先介绍一下TEE的主要关键技术&#xff1a; 1&#xff0e;安全启动&#xff08;Secure Boot&#xff09; 安全启动技术可以用于需要防止篡改系统镜像&#xff0c;比如安全系统&#xff0c;安全手机镜像等。 2&#xff…

StaticFactoryMethod_Level4

以下代码是“简单工厂模式”的第四个例子&#xff1a;

jquery 获取Select option 选择的Text和Value

jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关设置 获取一组radio被选中项的值:var item $(input[nameitems][checked]).val();获取select被选中项的文本:var item $("select[nameitems] option[selected]").text(); 获取…

Android -- Annotation(注解)原理详解及常见框架应用

1&#xff0c;我们在上一篇讲到了EventBus源码及3.0版本的简单使用&#xff0c;知道了我们3.0版本是使用注解方式标记事件响应方法的&#xff0c;这里我们就有一个疑问了&#xff0c;为什么在一个方法加上类似于“Subscribe”&#xff0c;就可以让我们的反射找到我们的事件响应…

简单工厂模式(StaticFactoryMethod)

来华北电力大学数理系LSGO软件技术团队学习Coding&#xff0c;我通常第一个就讲“简单工厂模式”&#xff0c;这一讲不仅仅是讲模式&#xff0c;更主要的是让大家体会什么是软件系统的“可复用”、“可扩展”、“易维护”、“灵活性好”&#xff0c;以及如何通过面向对象程序设…

Html,Css,Javascript是什么?

本文属于基础科普文&#xff0c;高富帅们请绕道吧。 Html&#xff0c;css&#xff0c;javascript是做网页前台设计的标准套装&#xff0c;html是一些网页控件&#xff0c;css是美化这些控件的代码&#xff08;层叠样式表&#xff09;&#xff0c;js&#xff08;javascript&…

[转帖]ERP术语

栖息谷-IT管理-[转帖]ERP术语 [转帖]ERP术语 1 英文缩写&#xff1a; MIS 英文全称&#xff1a; Management Information System 中文翻译&#xff1a; 管理信息系统 简释&#xff1a; MIS是指对企业大量的原始管理…

how tomcat works 总结 二

第五章 servlet容器 第 5 章讨论 container 模块。container 指的是 org.apache.catalina.Container 接口&#xff0c;有4 种类型的 container:engine, host, context 和 wrapper。这章提供了两个工作于 context 和wrapper 的程序。容器共分四类,类图例如以下:一个wrapper就是一…

策略模式(Strategy)

这是来数理系LSGO软件技术团队学习Coding&#xff0c;第二个要学习的设计模式。该模式在解决同一个问题时可以使用不同的算法。以满足“开闭原则”&#xff0c;把各种算法与实际业务逻辑解耦合&#xff0c;以便写出良好的代码。

[scrum]2011/9/22-----第二天

scrum 总结&#xff1a; Team member Yesterday’s Work Today’s Work Issue R X Task196:Completed xml 文件的解析&#xff0c;并且通过了两个测试用例 Task198:Completed 添加全局变量&#xff1a;当前会议和remind list Task201&#xff1a;Active 基本完成了select …

千千静听4.6.7版发布了

现在这个版本算是很不错的了&#xff0c;提供了相当完善的播放功能 下载&#xff1a; http://ttplayer.com/ttpsetup.exe 转载于:https://www.cnblogs.com/it201108/archive/2006/04/29/2148385.html

Strategy_Requirement1

以下代码是“策略模式”的第一个例子&#xff1a;

代码解说Android Scroller、VelocityTracker

在编写自己定义滑动控件时经常会用到Android触摸机制和Scroller及VelocityTracker。Android Touch系统简单介绍&#xff08;二&#xff09;:实例具体解释onInterceptTouchEvent与onTouchEvent的调用过程对Android触摸机制须要用到的函数进行了具体的解释。本文主要介绍两个重要…

写给云栖社区在做网站的朋友一点干货

我本人也是从事网站建设及APP开发业务的&#xff0c;工作多年下来&#xff0c;从以前的几百元企业网站&#xff0c;到商城网站&#xff0c;以及一些应用类型的APP开发&#xff0c;亲眼目睹了很多企业&#xff0c;以及很多项目&#xff0c;在应用的过程中&#xff0c;过了1-2年&…

Strategy_Requirement2

以下代码是“策略模式”的第二个例子&#xff1a;

如何启用SQL Server 2008的FILESTREAM特性

如何启用SQL Server 2008的FILESTREAM特性 今天安装SQL Server 2008的时候没有注意&#xff0c;忘记了启用FILESTREAM特性&#xff0c;因为默认情况下FILESTREAM是禁用的。安装完成后&#xff0c;再导入一个.bak的备份数据库时提示FILESTREAM feature is disabled&#xff0c;到…

如何在搜索结果出来之前,让页面显示“等待中。。。”

在当前页面点击搜索按纽后&#xff0c;当前页的button onclick事件会生成一个sql语句&#xff0c;然后转到查询结果页面&#xff0c;由于查询可能很费时间&#xff0c;客户要求在这两个页面中加入一个提示用户正在查询&#xff0c;请等待的页&#xff0c;具体的查询是在查询结果…