冒泡、归并和快速的算法试验

我是乔帮主 2019-04-01 13:23:10 ⋅ 774 阅读

1. 冒泡排序

/**
* 冒泡排序
*/

private void bubbleSort(int[] arr) {
for (int i = arr.length; i > 0; i--) {
for (int j = arr.length - 1; j > arr.length - i; j--) {
if (arr[j] < arr[j - 1]) {
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
}

2. 快速排序

 /**
* 快速排序
*/

private void qSort(int[] arr, int head, int tail) {
if (arr == null || head >= tail || arr.length == 0) {
return;
}
int i = head, j = tail, q = arr[(i + j) / 2];

while (i < j) {
while (arr[i] < q) {
++i;
}

while (arr[j] > q) {
--j;
}

if (i < j) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
++i;
--j;
} else if (i == j) {
++i;
}
}

qSort(arr, head, j);
qSort(arr, i, tail);

}

3. 归并排序

static void merge_sort_recursive(int[] arr, int[] result, int start, int end) {
if (start >= end)
return;
int len = end - start, mid = (len >> 1) + start;
int start1 = start, end1 = mid;
int start2 = mid + 1, end2 = end;
merge_sort_recursive(arr, result, start1, end1);
merge_sort_recursive(arr, result, start2, end2);
int k = start;
while (start1 <= end1 && start2 <= end2)
result[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
while (start1 <= end1)
result[k++] = arr[start1++];
while (start2 <= end2)
result[k++] = arr[start2++];
for (k = start; k <= end; k++)
arr[k] = result[k];
}
public static void merge_sort(int[] arr) {
int len = arr.length;
int[] result = new int[len];
merge_sort_recursive(arr, result, 0, len - 1);
}

4. 测试代码

@Test
public void testSpeed()
{
Random random = new Random();
int arrs[] = new int[30000];
for (int i = 0; i < arrs.length; i++) {
arrs[i] = random.nextInt(10000);
}

int[] arrs2 = arrs.clone();
int[] arrs3 = arrs.clone();
int[] arrs4 = arrs.clone();

long start = System.currentTimeMillis();
bubbleSort(arrs);

long end1 = System.currentTimeMillis();
log.info("冒泡排序 time:{}ms",(end1-start));

qSort(arrs2,0,arrs2.length-1);
long end2 = System.currentTimeMillis();
log.info("快速排序 time:{}ms",(end2-end1));

merge_sort(arrs3);
long end3 = System.currentTimeMillis();
log.info("归并排序 time:{}ms",(end3-end2));

Arrays.sort(arrs4);
long end4 = System.currentTimeMillis();
log.info("java.util排序 time:{}ms",(end4-end3));
}

5. 测试结果

  1. 当数组长度60000时

15:35:28.609 [main] INFO com.zhiyis.framework.learn.sort.testSort - 冒泡排序 time:8497ms
15:35:28.645 [main] INFO com.zhiyis.framework.learn.sort.testSort - 快速排序 time:40ms
15:35:28.669 [main] INFO com.zhiyis.framework.learn.sort.testSort - 归并排序 time:24ms
15:35:28.696 [main] INFO com.zhiyis.framework.learn.sort.testSort - java.util排序 time:27ms
  1. 当数组长度30000时

15:34:48.389 [main] INFO com.zhiyis.framework.learn.sort.testSort - 冒泡排序 time:2727ms
15:34:48.403 [main] INFO com.zhiyis.framework.learn.sort.testSort - 快速排序 time:18ms
15:34:48.418 [main] INFO com.zhiyis.framework.learn.sort.testSort - 归并排序 time:15ms
15:34:48.428 [main] INFO com.zhiyis.framework.learn.sort.testSort - java.util排序 time:10ms
  1. 当数组长度3000时

15:33:52.156 [main] INFO com.zhiyis.framework.learn.sort.testSort - 冒泡排序 time:22ms
15:33:52.167 [main] INFO com.zhiyis.framework.learn.sort.testSort - 快速排序 time:21ms
15:33:52.171 [main] INFO com.zhiyis.framework.learn.sort.testSort - 归并排序 time:4ms
15:33:52.183 [main] INFO com.zhiyis.framework.learn.sort.testSort - java.util排序 time:12ms
  1. 当数组长度300时

15:33:34.345 [main] INFO com.zhiyis.framework.learn.sort.testSort - 冒泡排序 time:3ms
15:33:34.356 [main] INFO com.zhiyis.framework.learn.sort.testSort - 快速排序 time:17ms
15:33:34.357 [main] INFO com.zhiyis.framework.learn.sort.testSort - 归并排序 time:1ms
15:33:34.357 [main] INFO com.zhiyis.framework.learn.sort.testSort - java.util排序 time:0ms
  1. 当数组长度30时

15:33:07.920 [main] INFO com.zhiyis.framework.learn.sort.testSort - 冒泡排序 time:0ms
15:33:07.933 [main] INFO com.zhiyis.framework.learn.sort.testSort - 快速排序 time:21ms
15:33:07.933 [main] INFO com.zhiyis.framework.learn.sort.testSort - 归并排序 time:0ms
15:33:07.934 [main] INFO com.zhiyis.framework.learn.sort.testSort - java.util排序 time:1ms

6. 总结

  1. 我的测试有什么变量控制问题可以提出来

  2. 冒泡排序的时间复杂度最好是O(N),平均和最差O(N^2);快速排序最好Nlog_2 N,平均也是Nlog_2 N,最差N^2;归并排序最好平均和最差都是Nlog_2 N。根据算法时间复杂度看,归并排序最稳定

  3. 根据实验结果看,在排序数量比较少的情况下冒泡排序效率也还可以,但一旦排序数量多了,还是快速和归并效率较高。当然我们往往就用java默认提供给我们的工具类就可以了,不用自己写算法,效率不比归并差。

---------------END----------------

后续的内容同样精彩

长按关注“IT实战联盟”哦




全部评论: 0

    我有话说:

    算法实战---OC快速排序(一)

    近来在巩固数据结构算法知识, 动动手操作操作. 能讲出来是真懂了, 分享是件快乐事第一.

    排序 --- 归并排序

    此篇文章引自 这里,个人感觉无出其右者,只好借鉴而来 归并排序 是递归分治有序合并简称, 首先利用分治法思想将序列递归分裂成若干个子序列,使将子序列基本有序,最后使整体有序。 一、图示

    算法实战---OC希尔排序(二)

    我没有为这种算法做任何事,我名字不应该出现在算法名字中。---- 希尔(shell排序作者)

    阿里大牛谈垃圾回收算法是如何设计

    前言 如果大家关注 JDK,会发现在频繁发布 JDK 版本中,垃圾回收相关 JEP (JDK Enhancement Proposals,Java 增强提案)越来越多了,垃圾回收

    产品匠心打磨200天,仅推出市场半年用户量突破1亿,日播放视频超10亿,PK快手美拍

    抖音从8人团队起家是如何在短短500天取得如此成绩,本文试图从产品运营角度来复盘一下,希望可以尽可能探讨背后真相。

    RedisPlus 3.0.0 重构归来免费开源,优化性能交互体验

    RedisPlus是为Redis可视化管理开发一款开源免费桌面客户端软件,支持Windows 、Linux、Mac三大系统平台,RedisPlus提供更加高效、方便、快捷使用体验,有着更加

    如何实现单服务器300万个长连接

    有没有试验过单机能抗300万个长连接操作?分享一下

    Spring Initializr 0.1.0 发布,Spring 项目快速开始生成器

    Spring Initializr 0.1.0 已经发布。 Spring initializr 是一个 Spring 项目快速开始生成器。其提供了一个可扩展 API 来生成基于 JVM

    Docker - 大数据环境快速搭建步骤

    快速搭建一个大数据环境,我们可以使用Docker来实现,文章会演示如何使用。

    运用Docker快速部署分布式项目

    快速搭建Docker分布式项目环境

    TestableMock v0.6.0 发布,新增测试参数快速构造工具

    项目介绍 TestableMock是一款由阿里效能团队开源Java单元测试增强工具,提供四项具有针对性辅助能力: 快速Mock任意调用:解决传统Mock工具使用繁琐问题 访问被测类私有成员

    Nginx架构详解:nginx 安装配置

    Nginx (engine x) 是一个高性能HTTP反向代理服务器,也是一个IMAP/POP3/SMTP服务器。

    「轻阅读」“做完”“做好”区别

    在工作中,“做完”“做好”虽然仅一字之差,但前者只是完成了某项工作,而后者则不仅是完成了工作还有一个好

    OAuth2 JWT - 如何设计安全 API?

    来源:jianshu.com/p/1f2d6e5126cb JWTOAuth2比较? JSON Web Token (JWT) OAuth2是什么? 结论 在作者看来两种

    Cookie Session不难,一个是Mapkey,一个是Mapvalue

    本文分别对Cookie与Session做一个介绍总结,并分别对两个知识点进行对比分析,让大家对CookieSession有一个更深入了解,并对自己开发工作中灵活运用带来启示。

    kafka快速入门

    Kafka可以起到两个作用:1、降低系统组网复杂度;2、降低编程复杂度,各个子系统不在是相互协商接口,各个子系统类似插口插在插座上,Kafka承担高速数据总线作用;

    小程序 、 App H5 之间区别详解

    根据微信官方说明,微信小程序运行环境有 3 个平台,iOS WebKit(苹果开源浏览器内核),Android X5 (QQ 浏览器内核),开发时用 nw.js(C++ 实现

    京东技术:面对海量流量七步走保证用户体验(部分操作能够快速实战)

    当促销活动正式开始时,不少用户开启了价格保护,在此高并发情况下,如何保证用户体验,如何保证系统稳定性、高可用、快速计算结果,是本文重点。