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

三种基本排序的实现及其效率对比:冒泡排序、选择排序和插入排序

  1 public class ThreeTypesOfBaseSort {
  2   //    ========================== 三种基本排序的效率对比 ============================
  3   public static void main(String[] args) {
  4     ThreeTypesOfBaseSort sort = new ThreeTypesOfBaseSort();
  5 
  6     // 测试百万级别的数组排序,看三种基本排序的的效率差别:
  7     int number = 500000;
  8     int[] array = new int[number];
  9     int[] array1 = new int[number];
 10     int[] array2 = new int[number];
 11     for(int i = 0; i < array.length; i++) {
 12       int temp = new Random().nextInt(number);
 13       array[i] = temp;
 14       array1[i] = temp;
 15       array2[i] = temp;
 16     }
 17     System.out.println("数组准备完毕~");
 18 
 19     long start1 = System.currentTimeMillis();
 20     sort.bubbleSort(array);
 21     long end1 = System.currentTimeMillis();
 22     System.out.println("bubbleSort 用时:" + (end1 - start1));//测试结果:当元素个数为5万时:4157。50万:430255。100万:1644079
 23 
 24     long start2 = System.currentTimeMillis();
 25     sort.selectionSort(array1);
 26     long end2 = System.currentTimeMillis();
 27     System.out.println("selectSort 用时:" + (end2 - start2));//5万:727。50万:74253。100万:281276 ==》选择排序比冒泡快了5.7倍。
 28 
 29     long start3 = System.currentTimeMillis();
 30     sort.insertionSort(array2);
 31     long end3 = System.currentTimeMillis();
 32     System.out.println("insertionSort 用时:" + (end3 - start3));//5万:827。50万:84644。 ==》插入排序比选择排序稍慢一点。
 33   }
 34 
 35   //    ========================== BubbleSort ============================
 36   /**
 37   * 冒泡排序:相邻的两个数进行比较,如果是从小到大排序,则将较大的那个数放后,每次都要交换。
 38 
 39   * 冒泡排序的优化思路:
 40   *       ① 判空;
 41   *       ② 元素的个数很特殊时:个数为0、1时;
 42   *       ③ 数组已经是有序的,或者是数组里所有元素都相同:
 43   */
 44   public void bubbleSort(int[] target){
 45     if(target == null){
 46       return;
 47     }
 48     boolean tag = true;//如果数组是有序的,则不需要再进行交换。
 49     for(int i = 0; i < target.length -1 && tag; i++){//外层循环:控制比较的组数:(元素个数-1)次。
 50       tag = false;
 51       for(int j = 0; j < target.length - i - 1; j++){//内层循环:控制比较的元素:每组比较都从第一个元素开始比较,把每次比较时的max移到后面去,每组的比较次数=target.length-1-i。
 52         if(target[j] > target[j + 1]){
 53           int temp = target[j];
 54           target[j] = target[j + 1];
 55           target[j + 1] = temp;
 56           tag = true;
 57         }
 58       }
 59     }
 60   }
 61 
 62   //    ======================= SelectionSort ============================
 63   /**
 64   * 选择排序:
 65   *   第一趟从n个元素的数据序列中选出关键字最小/大的元素并放在最前位置,
 66   *   下一趟从n-1个元素中选出最小/大的元素并放在未排好序元素的最前位置。以此类推,经过n-1趟完成排序。
 67   */
 68   public void selectionSort(int[] target){
 69     if(target == null){
 70       return;
 71     }
 72     for(int i = 0; i < target.length - 1; i++){
 73       int tempIndex = i;
 74       for(int j = i + 1; j < target.length; j++){
 75         if(target[tempIndex] > target[j]){
 76           tempIndex = j;
 77         }
 78       }
 79     int temp = target[tempIndex];
 80     target[tempIndex] = target[i];
 81     target[i] = temp;
 82     }
 83   }
 84 
 85   //    ===================== insertSort ====================================
 86   /**
 87   * 插入排序:将一个数据插入到已经排好序的有序数据中(一般默认第一个元素是有序的,比较从第二个元素开始),
 88   * 从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。
 89   */
 90   public void insertionSort(int[] target){
 91     if(target == null){
 92       return;
 93     }
 94     //外层循环控制比较的组数;
 95     for(int i = 0; i < target.length - 1; i++){
 96       //内层循环负责找出该组比较中,在已排好序数组之后的第一个无序的元素,并通过比较将这个无序元素插入到有序数组中。
 97       for(int j = i + 1; j > 0; j--){
 98         if(target[j - 1] > target[j]){
 99           int temp = target[j];
100           target[j] = target[j - 1];
101           target[j - 1] = temp;
102         }else{
103           break;
104         }
105       }
106     }
107   }
108 }

测试结果:

时间单位:毫秒
  1. 冒泡排序:5万个元素的排序:4157。  50万:430255。  100万:1644079
  2. 选择排序:5万:727。                         50万:74253。     100万:281276
  3. 插入排序:5万:827。                         50万:84644。
  4. 快速排序:5万:11。                           50万:66。            100万:136。

总结:
  选择排序 > 插入排序 > 冒泡排序;
  选择排序比插入排序快了1.1倍,比冒泡排序快了越5.7倍;

【该文章为本人原创,内容如有错误、不妥之处,还请不吝赐教 ^_^】

转载于:https://www.cnblogs.com/laipimei/p/11118561.html

相关文章:

NB-IOT UE的小区接入过程

NB-IOT UE的小区接入过程如下&#xff1a;NPSS/NSSS/NPBCH的时频资源&#xff0c;可以参考&#xff1a;点击打开链接 下面详细介绍一下MIB-NB/SIB1-NB的获取过程。 MIB-NB传输 在sharetechnote中有详细的描述&#xff0c;如下&#xff1a; MIB-NB分成8个等长的可以独立编码的子…

android用户界面之菜单(Menu)教程实例汇总

一、Menu的基本介绍1.从头学Android之Menu选项菜单 http://www.apkbus.com/android-13930-1-1.html 2.Android 界面之Menu菜单的特性 http://www.apkbus.com/android-664-1-1.html 3.Android XML中自定义菜单 http://www.apkbus.com/android-50884-1-1.html 4.Android 基础菜单…

nosql mysql mongodb_关于NoSQL之MongoDB的一些总结

NoSQL已经流行了很长一段时间&#xff0c;那么究竟是什么场景下你才更需要用到这些“新兴事物”&#xff0c;就比如MongoDB&#xff1f;下面是一些总结&#xff1a;你期望一个更高的写负载默认情况下&#xff0c;对比事务安全&#xff0c;MongoDB更关注高的插入速度。如果你需要…

下载文件乱码问题

1.下载文件乱码问题 new String("免责声明.pdf".getBytes("utf-8"), "ISO-8859-1")&#xff1b; 2.图片转blog String path request.getSession().getServletContext().getRealPath("/"); String a picturename2…

MySQL全面优化,速度飞起来

在进行MySQL的优化之前&#xff0c;必须要了解的就是MySQL的查询过程&#xff0c;很多查询优化工作实际上就是遵循一些原则&#xff0c;让MySQL的优化器能够按照预想的合理方式运行而已。 图-MySQL查询过程 一、优化的哲学 注&#xff1a;优化有风险&#xff0c;涉足需谨慎 1、…

LTE - PRACH 时频资源介绍

PRACH&#xff1a; Physical Random Access Channel. PRACH用于传输random access preamble RA-preamble Format 一共包含4种格式&#xff0c;其中format0-3 用于frametype 1(FDD), format 0-4 用于frametype 2(TDD). spec: 36.211- table5.7.1-1另外参考sharetechnote&#xf…

对面向对象基本原则的总结

&#xff08;一&#xff09;代理模式 应用场景&#xff1a;当一个类的某些功能需要由别的类来实现&#xff0c;但是又不确定具体会是哪个类实现。 优势&#xff1a;解耦合 敏捷原则&#xff1a;开放-封闭原则 实例&#xff1a;tableview的 数据源delegate&#xff0c;通过和pro…

python turtle画画 30排以内_Python竟能画这么漂亮的花,帅呆了(代码分享)

阅读本文大概需要3分钟关于函数和模块讲了这么久&#xff0c;我一直想用一个好玩有趣的小例子来总结一下&#xff0c;同时也作为实战练习一下。趣味编程其实是最好的学习途径&#xff0c;回想十几年前我刚毕业的时候&#xff0c;第一份工作就给手机上写app&#xff0c;当时觉得…

关于Windows 2003下开启防火墙后不能通过FTP问题解决

在Windows server 2003上做了个基于IIS的FTP服务。但是不久就发现一个问题&#xff0c;当系统开启防火墙后在其它机子上不能登录FTP服务器&#xff0c;但是又不想把Windows的防火墙晾起来&#xff0c;所以就尝试下突破这个限制。当时做了两步处理&#xff1a;&#xff08;1&…

【多线程】ConcurrentLinkedQueue 的实现原理

1. 引言 在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式&#xff1a;一种是使用阻塞算法&#xff0c;另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁&#xff08;入队和出队用同一把锁&#xff09;或两个锁&#xf…

shell 脚本简单入门

好久不写shell脚本&#xff0c;有些生疏。总结下shell的语法&#xff0c;以便后续参考&#xff0c;快速捡起来。 shell 脚本执行的3种方式&#xff1a; 1). ./xx.sh &#xff08;xx.sh 需要有执行权限&#xff09; 2). source xx.sh 3). bash xx.sh 变量定义 var2 //注意&…

ubuntu 在线安装mysql_Ubuntu下安装MySQL5.6

我想我们不应该在安装软件上面耽误太多时间&#xff0c;但是很多时候&#xff0c;我们去被安装挡在了门外&#xff0c;尤其是初次在Linux下。作为一个程序猿&#xff0c;最近决定转战linux&#xff0c;MySQL是必须要有的&#xff0c;讲一下我的安装过程。在Ubuntu下安装MySQL有…

js循环动态绑定带参数函数遇到的问题及解决方案[转]

今天写原生javascript时&#xff0c;想利用绑定事件实现类似jquery中on方法的功能&#xff1a;于是有了for循环里绑定事件&#xff0c;无意中发现定义类能解决好多问题&#xff01; 例如&#xff1a;一个不确定长度的列表&#xff0c;在鼠标经过某一条的时候改变背景 1 2 <…

基于Picture Library创建的图片文档库中的上传多个文件功能(upload multiple files)报错怎么解决?...

复现过程 首先&#xff0c;我创建了一个基于Picture Library的图片文档库&#xff0c;名字是 Pic Lib 创建完毕后&#xff0c;我点击它的Upload 下拉菜单&#xff0c;点击Upload Picture按钮 在弹出的对话框中点击 Upload Multiple Files按钮 结果返回了下面的错误页面 如果查看…

vi 环境,跳转函数定义

1, 安装 sudo apt-get install exuberant-ctags 2. 生成tags ctags -R . 3. 跳转 将光标移到想要跳转的函数或变量 快捷键 " CTRL ] " 4. 回转 回到跳转之前的位置&#xff0c; 只需要通过快捷键“ CTRL T ” 其它更详细&#xff1a; https://www.cnblogs.com/ca…

linux kernel内存回收机制

http://www.wowotech.net/linux_kenrel/233.html无论计算机上有多少内存都是不够的&#xff0c;因而linux kernel需要回收一些很少使用的内存页面来保证系统持续有内存使用。页面回收的方式有页回写、页交换和页丢弃三种方式&#xff1a;如果一个很少使用的页的后备存储器是一个…

Python 学习笔记01

print&#xff1a;直接输出 type&#xff0c;求类型 数据类型&#xff1a;字符串&#xff0c;整型&#xff0c;浮点型&#xff0c;Bool型 note01.py # python learning note 01 print(Hello world!) a 10 print a print type(a) a 1.3 print a,type(a) print a Tr…

vuecli 编译后部署_基于vue-cli 打包时抽离项目相关配置文件详解

前言&#xff1a;当使用vue-cli进行开发时时常需要动态配置一些设置&#xff0c;比如接口的请求地址(axios.defaults.baseURL)&#xff0c;这些设置可能需要在项目编译后再进行设置的&#xff0c;所以在vue-cli里我们需要对这些配置文件进行抽离&#xff0c;不让webpack把配置文…

intel xdk 打ios的ipa包

1、打包 2、点击edit。下载csr文件&#xff0c;然后上传到苹果开发者网址&#xff0c;生成cer文件 上面两步搞完&#xff0c;把最后的按钮设置成"yes" 3、上传配置文件 转载于:https://www.cnblogs.com/linn/p/3844930.html

《C++程序设计POJ》《WEEK7 输入输出和模板》《流操纵算子》《文件读写》《二进制文件读写》...

函数指针&#xff0c;运算符重载 人懂我精&#xff0c;人精我深 用的时候查一查手册 dat 二进制文件 如果不指定文件夹&#xff0c;就是生成在当前文件夹&#xff0c;什么是当前文件夹&#xff1f;可执行文件所在的文件夹 绝对路径 相对路径 文件的读写指针 ifstream ofsteam s…

linux内存管理 之 内存节点和内存分区(Zone)

https://www.cnblogs.com/youngerchina/p/5624516.html Linux支持多种硬件体系结构&#xff0c;因此Linux必须采用通用的方法来描述内存&#xff0c;以方便对内存进行管理。为此&#xff0c;Linux有了内存节点、内存区、页框的概念&#xff0c;这些概念也是一目了然的。 内存节…

BZOJ 3585: mex( 离线 + 线段树 )

离线, 询问排序.先处理出1~i的答案, 这样可以回答左端点为1的询问.完成后就用seq(1)将1到它下一次出现的位置前更新. 不断这样转移就OK了--------------------------------------------------------------------#include<bits/stdc.h>using namespace std;#define M(l, r…

yum安装mysql后密码_Centos7:yum安装MySQL5.7后如何设置root密码

Centos下安装软件的方式很简单&#xff0c;只需要通过yum install xxx命令即可。第一步当然检查是否有mysql的yum源&#xff0c;命令&#xff1a;yumlist|grep mysql-community[主要还是安装开源的社区版]如果没有如图所示的和mysql*相关的数据源&#xff0c;可去官网上下载相关…

iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)

使用Block的地方很多&#xff0c;其中传值只是其中的一小部分&#xff0c;下面介绍Block在两个界面之间的传值&#xff1a;先说一下思想&#xff1a;首先&#xff0c;创建两个视图控制器&#xff0c;在第一个视图控制器中创建一个UILabel和一个UIButton&#xff0c;其中UILabel…

Vscode 调试 Flutter 项目

1、Vscode 中打开 flutter 项目进行开发 2、运行 Flutter 项目 flutter run r 键:点击后热加载&#xff0c;也就算是重新加载吧。p 键:显示网格&#xff0c;这个可以很好的掌握布局情况&#xff0c;工作中很有用。 o 键:切换 android 和 ios 的预览模式。q 键:退出调试预览模…

Linux地址映射--线性映射与非线性映射

一&#xff0c;线性映射与非线性映射 1. 内存管理 物理内存管理&#xff1a; Linux内存最小管理单位为页&#xff08;page&#xff09;&#xff0c;通常一页为4K。初始化时&#xff0c;linux会为每个物理内存也建立一个page的管理结构&#xff0c;操作物理内存时实际上就…

第三方消息推送回调Java app消息推送第三方选择

由于最先集成的是极光,因此根据官方给的推送设备区分方式中,选择了使用标签tag来进行区分管理方式,其接口提供了设置和清理标签, 每次设置会覆盖上次的结果,当然这个需要和极光后台进行交互,是异步返回的。5、由于其接口没有使用免费和付费区分,对于接口的访问没有限制,从使用的情况来看,经常会出现不准的情况,并且设置标签的效果其实是添加,导致业务需要改变标签时,需要先清除在设置,然而接口又经常出问题,导致这部分也是一塌糊涂了;如果想使用不受免费版本限制特性的推送服务,可以联系平台提供的商务对接,购买付费版本。

[SDOI2015]权值

问题描述&#xff1a; 有一个长度为n的实数序列&#xff0c;,下标从1开始&#xff0c;其中第k个位置的实数为p (sin(a k b) cos(c k d) 2)&#xff0c;sin和cos采用弧度制&#xff0c;其中p&#xff0c;a&#xff0c;b&#xff0c;c&#xff0c;d均为给定的整数。你需要…

为什么前后端都需要进行数据校验?

前端和后端各自的数据完整性校验是相辅相成的。前端校验可以提供即时反馈和优化用户体验,减轻后端服务器压力;后端校验是最终的安全防线,确保数据的完整性和一致性。通过前后端的数据完整性校验机制的结合,可以提供更可靠和安全的应用程序。

多个网站共享一个mysql数据库_如何在多个Postgresql数据库之间共享表

是的,模式是解决方案.使用单个Postgresql集群,使用单个数据库.为所有应用用户创建一个组&#xff1a;CREATE ROLE app;创建全局“应用程序”模式,其中所有全局共享应用程序表都将生效.CREATE SCHEMA AUTHORIZATION app;CREATE TABLE app.objects ( objectid int PRIMARY KEY );…