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

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

  1. c语言数组项目按身高排序,过三关 Java冒泡排序选择排序插入排序小练习

    材料:猴子排序,按照身高来从小到大来排序. 第一关: 老猴子带领小猴子队伍按大小逐一比较,交换,开始高矮排列队伍.(冒泡排序) 第二关: 太慢了,给第一关增加难度,进行选择排序 第三关: 最后,尝试选 ...

  2. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  3. 【排序算法】冒泡排序|选择排序|插入排序|希尔排序

    文章目录 冒泡排序 选择排序 插入排序 希尔排序 冒泡排序   第一个元素开始向第二个元素比较,若大于则交换位置,不大于则不动.然后第二个元素和第三个元素比较,再然后第三个元素和第四个元素比较-一直比 ...

  4. 十大经典排序算法详解(一)冒泡排序,选择排序,插入排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 目录 1.算法的评判标准 2.排序算法的分类 3.十大经典排序算法-冒泡排序,选择排序,插入排序 ...

  5. 经典排序算法(一) —— Selection Sort 选择排序

    经典排序算法(一) -- Selection Sort 选择排序 文章目录 经典排序算法(一) -- Selection Sort 选择排序 简介 排序过程 实现 复杂度 简介 选择排序是一种简单直观 ...

  6. c语言选择排序法程序设计,C语言基础之选择排序算法和代码

    在利用C语言进行编写程序的过程中,我们会常常通过算法及其代码来进行相关程序的编写工作.今天课课家笔者先给大家介绍C语言算法中的选择排序算法以及代码.那么到底什么是选择排序算法呢?下面由笔者慢慢道来. ...

  7. 冒泡排序选择排序插入排序

    目录 冒泡排序 选择排序 插入排序 冒泡排序 冒泡排序(最好是O(n), 最坏O(n2)) 原理: 拿自己与上面一个比较,如果上面一个比自己小就将自己和上面一个调换位置,依次再与上面一个比较,第一轮结 ...

  8. 三种流行防火墙配置方案分析与对比

    当我们尽情地在Internet上畅游时,往往把网络的安全问题抛在脑后.其实危险无处不在,防火墙是网络安全的一个重要防护措施,用于对网络和系统的保护.监控通过防火墙的数据,根据管理员的要求,允许和禁止特 ...

  9. 第三次学JAVA再学不好就吃翔(part59)--冒泡排序选择排序以及二分查找

    学习笔记,仅供参考 文章目录 数组高级冒泡排序 数组高级选择排序 二分查找法 数组高级冒泡排序 冒泡排序原理:设数组中有n个元素,从第一个元素开始,对相邻元素进行两两比较,两个元素中大的往后放,第一次 ...

最新文章

  1. 前OnePlus视觉设计师蔡孝永:视觉设计师都在想些什么?
  2. mysql之触发器trigger
  3. LeetCode 第 199 场周赛(757/5231,前14.5%)
  4. LeetCode 681. 最近时刻
  5. 【Flink】kafka INVALID_PRODUCER_EPO send data to Kafka old epoch newer producer same transactionalId
  6. Python基础-高级变量类型
  7. ThreadLocal,静态变量,实例变量,局部变量的线程安全
  8. 使用Telnet客户端测试Exchange邮件收发
  9. brew切换到清华源
  10. 牛腩新闻发布系统-概要介绍
  11. cr2格式是什么意思?cr2格式用什么软件打开?cr2格式怎么转换成jpg
  12. Vue移动端rotate强制横屏
  13. qlv格式转mp4格式(简单、高效)
  14. obs听到了自己的回音_如何在直播中解决播放杂音、噪音、回声问题 | 直播疑难杂症排查...
  15. 懂球帝Android客户端WebView优化之路
  16. Linux命令--nc (测试服务器端口是否打开)
  17. 2022年危险化学品经营单位主要负责人考试题模拟考试平台操作
  18. 燕山大学数据结构与算法课程实践——ISBN号识别系统的设计与开发
  19. C# 编写Windows Service(windows服务程序)
  20. (最新react-native-0.59.5) 如何将ReactNative项目集成到现有得Android项目中(两种实现方法之一)

热门文章

  1. Request To JavaBean(请求对象转换为JavaBean对象)
  2. DC-RC加固修补型砂浆
  3. mac的终端下面使用ssh user@localhost输入密码 不能正常登录
  4. Oracle 小知识点
  5. cas server 配置
  6. Javascript与正则表达式个人总结与收录--高级篇
  7. 我是“真正的”软件工程师吗?
  8. singleton设计模式_让我们研究一下Singleton设计模式的优缺点
  9. mysqlls_mysql基本命令
  10. Android中的网络(字节跳动)