java实现冒泡排序,直接插入排序,选择排序,希尔排序,以及求出它们的时间复杂度O(n)

2023-11-18

package com.yg.sort;/*
@author  GeQiLin
@date    2020/2/25  16:53
*/

import java.util.Arrays;

public class Sort1 {
    private static int max =80000;
    private static int arr[];

    public static void main(String[] args) {
        //用于计算算法运行时间
        long t1, t2;
        //初始化数组
        setArr();
        System.out.println("无序数组:");
       // printfArr(arr);
        t1 = System.currentTimeMillis();
        //排序算法
        //shellSort(arr);数据量大优于冒泡,小的时候差不多
       // insertSort(arr);
       // insertSort2(arr);性能较快
        //bubbleSort(arr);
        shellSort2(arr);
        t2 = System.currentTimeMillis();
        System.out.println("有序数组:");
       //printfArr(arr);
        showExecuteTime(t1, t2);

    }

    private static void printfArr(int[] arr) {
        for (int item : arr) {
            System.out.print(item + " ");
        }
        System.out.println();
    }

    //冒泡排序
    /*
    相邻位置比较,如果是逆序就交换,
    交换后继续与下一个相邻位置的元素比较,直至比较数组大小减一次
    上述循环每次可确定最大的数,第二大的数,第三大的数。。。。
    重复循环数组大小-1次得到最终排序
    * */
    private static void bubbleSort(int[] arr) {
        int tem = 0;
        boolean flag = false;
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                //如果是逆序就交换
                if (arr[j] > arr[j + 1]) {
                    flag = true;
                    tem = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tem;
                }

            }
            if (!flag) {
                break;
            } else {
                flag = false;
            }
        }

    }

    //构建数组大小和值
    public static void setArr() {
        arr = new int[max];
        for (int i = 0; i < max; i++) {
            arr[i] = (int) (Math.random() * max);
        }
    }

    //测试算法执行时间
    public static void showExecuteTime(long t1, long t2) {
        System.out.println("排序所需时间:" + (t2 - t1) + "ms");
    }

    //选择排序
    /*
    第一次在arr[0]到arr[n-1]中选出最小的数和arr【0】交换
    第二次在arr【1】到arr【n-1】中选出最小的和arr【1】交换
    。。。以此类推
    选n-1次
    * */
    public static void selectSort(int[] arr) {
        //存放最小值索引
        int minIndex = 0;
        //存放最小值
        int min = 0;
        for (int i = 0; i < arr.length - 1; i++) {
            min = arr[i];
            minIndex = i;
            for (int j = i; j < arr.length - 1; j++) {
                if (min > arr[j + 1]) {
                    min = arr[j + 1];
                    minIndex = j + 1;

                }
            }
            //将最小值和arr【i】交换
            if (minIndex != i) {
                arr[minIndex] = arr[i];
                arr[i] = min;

            }

        }
    }

    //插入排序
    /*
     * 默认第1个元素在有序序列,第2到n个元素无序
     * 依次将第2到第n个元素加入到第一个元素所在的有序序列
     * */
    public static void insertSort2(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int insertVal = arr[i];
            int insertIndex = i - 1;
            //insertVal < arr[insertIndex] 当待插入元素大于有序序列最后一个元素时说明待插入元素此时相对于有序序列已经是有序的所以不用遍历比较
            while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
            //更新有序序列中元素的新位置
                arr[insertIndex + 1] = arr[insertIndex];
                insertIndex--;
            }
				//确认待插入元素在有序序列的位置
                arr[insertIndex + 1] = insertVal;


        }
    }

    //这种写法效率不高有序序列
    //因为无论当前待插入元素是否小于有序序列的最后一个元素,它都会便利
    public static void insertSort(int[] arr) {
        int tem=0;
        for (int i = 1; i < arr.length; i++) {
            for (int j = i-1; j >=0 ; j--) {
                if(arr[j+1]<arr[j]){
                    tem=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=tem;
                }
            }
        }
    }

    //希尔排序 交换法 效率不高,低于直接插入
    /*如果有n个元素
     * 每次将序列分为n/2组,然后将每组进行直接插入排序
     * 当n/2==1时序列大致有序,然后对整个序列采用希尔排序
     * */
    public static void shellSort(int[] arr) {
        int tem=0;
        //循环到只分一组使整个序列大致有序
        for (int gap = arr.length / 2; gap > 0; gap /= 2) {
            //此for循环决定进行插入排序的次数
            for (int i = gap; i < arr.length; i++) {
                //此for循环决定将要插入的元素需要和同组有序序列元素进行比较的次数
                for (int j = i - gap; j >= 0; j -= gap) {
                    if (arr[j] > arr[j +gap]) {
                            tem=arr[j];
                            arr[j]=arr[j+gap];
                            arr[j+gap]=tem;
                    }
                }
            }
        }
    }

    //希尔排序移位法,效率高
    /*
    先分组,然后采用直接插入
    * */
    public static void shellSort2(int []arr){
        int tem,j;
        for (int gap = arr.length/2 ; gap >0 ; gap/=2) {
            for (int i = gap  ; i <arr.length ; i++) {
                j=i;
                tem=arr[j];
                 if(arr[j]<arr[j-gap]){
                    while (j-gap>=0 && tem<arr[j-gap]){
                        arr[j]=arr[j-gap];
                        j-=gap;
                    }
                    arr[j]=tem;
                 }
                }
            }
        }
    }


冒泡排序:
时间复杂度为n的平方;
通过对比相邻元素如果是逆序则交换位置,依次在0-n个元素中找到最大的,0-n-1个元素中找到第二大的。。。。
效率问题:每次整个比较过程不会为下一次比较提供额外信息,所以即使在0-n个元素中找到了最大的元素,在0-n-1个元素时还是需要经行相邻元素的比较比较n-2次其中很多是没意义的比较。

归并排序:
时间复杂度为nlog(n)
将数组分解为左右两个部分,不断对左右两个部分进行左右递归分解,
直到每个部分只有一个元素,然后对不断对其进行合并,最终经过n-1次合并
成为有序序列;
效率优势:每一次合并而成的有序子序列都为后续的合并提供了额外的信息避免了后续的无效比较,效率比较高。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java实现冒泡排序,直接插入排序,选择排序,希尔排序,以及求出它们的时间复杂度O(n) 的相关文章

  • 有没有办法在 java 桌面应用程序上体验 Windows 8 Metro 的外观和感觉?

    正如标题中所述 我真的很难找到这个问题的好答案 我目前正在开发一个仅桌面应用程序 根本没有 CSS 或任何互联网部分 我希望它看起来像 Windows 8 的 Metro 外观 我不是在谈论布局 而是在谈论外观和感觉 我特别喜欢方形而不是圆
  • Hibernate 4 字节码增强不适用于脏检查优化

    我正在使用 Hibernate 4 3 6 并且我使用了最新的Maven 字节码增强 http vladmihalcea com hibernate 4 bytecode enhancement 使所有实体提高自我肮脏意识 我添加了mave
  • Android 中的 java.util.Observable 是线程安全的吗?

    Android 中的 java util Observable 是线程安全的吗 这文档 http developer android com reference java util Observable html说只有deleteObser
  • ListView:防止视图回收

    我有一个使用回收视图的 ListView 我试图阻止视图被回收 所以我使用 setHasTransientState android support v4 view ViewCompatJB setHasTransientState Vie
  • 探索java图像处理的好资源[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是图像处理领域的新手 请推荐一些好的资源 书籍和网络链接 来学习 Java 中的图像处理 最适合隐写术分析 适合初学者和高级水平 我看过
  • 如何停止使用扫描仪从标准输入读取多行?

    我正在做一个 JAVA 作业 应该处理多行输入 指令显示 输入是从标准输入读取的 给出了示例输入的示例 one 1 two 2 three 3 我不明白上面的示例输入 从标准输入读取 是什么意思 这是我编写的一个测试程序 它可以消除我的困惑
  • 我应该使用 JDBC getNString() 而不是 getString() 吗?

    我们正在构建一个由 Oracle 数据库支持的 Java 应用程序 我们使用 JDBC 驱动程序 访问该数据库ojdbc6 jar and orai18n jar 数据库模式主要使用以下方式存储文本列NVARCHAR2数据类型 The JD
  • 如何添加 Java 正则表达式实现中缺少的功能?

    我是 Java 新手 作为一名 Net 开发人员 我非常习惯Regex Net 中的类 Java 实现Regex 正则表达式 还不错 但它缺少一些关键功能 我想为 Java 创建自己的帮助器类 但我想也许已经有一个可用的了 那么 是否有任何
  • 限制 JPQL 中的结果数量

    如何限制从数据库检索结果的数量 select e from Entity e I need only 10 results for instance 您可以尝试像这样给出 10 个要显式获取的结果 entityManager createQ
  • Java - toString 到 Color

    我一整天都在努力解决这个问题 基本上我做了一个 for 循环 将条目添加到数组列表中 其中一项是 颜色 变量 我已经用过random nextInt为颜色构造函数的红色 绿色和蓝色部分创建新值 我还设置了一个toString方法 这样我就可
  • 如何使用 Swipe 视图实现 Android TabLayout 设计支持库

    我将使用 android TabLayout 设计支持库 但我不知道如何使用滑动视图 这是我的代码 XML
  • 欧拉项目 45

    我还不是一名熟练的程序员 但我认为这是一个有趣的问题 我想我应该尝试一下 三角形 五边形 六边形 数字由以下生成 公式 三角形 T n n n 1 2 1 3 6 10 15 五边形 P n n 3n 1 2 1 5 12 22 35 六角
  • 生产者程序中的 kafka 网络处理器错误(ArrayIndexOutOfBoundsException:18)

    我有下面的 kafka Producer Api 程序 我对 kafka 本身是新手 下面的代码从 API 之一获取数据并将消息发送到 kafka 主题 package kafka Demo import java util Propert
  • 使用java在网页中进行字符编码

    如何使用java找出网页中的字符编码类型 打开与 URL 的连接 使用URL openConnection http download oracle com javase 6 docs api java net URL html openC
  • 如何从 Trie 中检索给定长度的随机单词

    我有一个简单的 Trie 用来存储大约 80k 长度为 2 15 的单词 它非常适合检查字符串是否是单词 但是 现在我需要一种获取给定长度的随机单词的方法 换句话说 我需要 getRandomWord 5 来返回 5 个字母的单词 所有 5
  • 线程上下文类加载器和普通类加载器的区别

    线程的上下文类加载器和普通类加载器有什么区别 也就是说 如果Thread currentThread getContextClassLoader and getClass getClassLoader 返回不同的类加载器对象 将使用哪一个
  • 测量 tomcat 的排队请求数

    因此 使用tomcat 您可以设置acceptCount值 默认为100 这意味着当所有工作线程都忙时 新连接被放置在队列中 直到队列满 之后它们被拒绝 我想要的是监视此队列中项目的大小 但无法确定是否有办法通过 JMX 获取此值 即不是队
  • 使用 Commons 或 Guava 将文本文件转换为 Java Set

    我想将文件中的每一行加载到 HashSet 集合中 有没有一种简单的方法可以做到这一点 怎么样 Sets newHashSet Files readLines file charSet 使用番石榴 参考 文件 readLines http
  • 膨胀类 android.support.design.widget.CoordinatorLayoute 时出错

    我正在尝试运行我的应用程序 但不断收到标题中列出的错误 我读过周围的内容 人们说尝试将主题更改为 AppCombat 主题 但这似乎不起作用 以下是我遇到的错误 Process com example jmeyer27 crazytiles
  • 如何让JComboBox中的内容居中显示?

    目前我有这个JComboBox 我怎样才能将其中的内容居中 String strs new String 15158133110 15158133124 15158133458 JComboBox com new JComboBox str

随机推荐

  • Spring Boot Metrics使用

    Spring Boot 使用Metrics监控 导入pom依赖
  • 2021年第八届大唐杯全国大学生移动通信5G技术大赛省赛

    2021年第八届大唐杯全国大学生移动通信5G技术大赛省赛 实验背景 勘站规划 网络部署 开通调测 业务认证摘自 https www bilibili com video BV1Hr4y1Y7m8 spm id from 333 337 se
  • vue+$emit调用父级方法,添加其他参数

    前言 我们在vue中子组件调用父组件的方法使用的是this emit 方法名 参数 但是在某些特定场合 我们还希望可以在父组件那里添加其他参数 实现方法
  • 新手学习Python要注意的13个问题

    作为一门易学的编程语言 Python对初学者来说确实是一个非常好的选择 不过 初学者在学习Python的过程中可能会遇到一些常见的问题 以下是一些常见的Python学习问题 语法错误 语法错误是最常见的问题之一 初学者经常会忘记冒号 括号
  • llvm之IR设计

    llvm之IR设计 引言 1 逻辑关系 2 class Module 3 class IRBuilder 4 class Instruction 5 class Constant 6 class Function 引言 llvm IR是ll
  • v-if与v-show的区别=====》面试题

    共同点 都是控制元素显示或隐藏的指令 区别 v show 控制元素无论是true还是false都会被渲染出来 通过diaplay none控制元素隐藏 v if控制元素是true渲染 是false不渲染 在dom树结构中不显示 加分回答 应
  • [STM32系列]一、HAL库的串口中断接收

    STM32系列 一 HAL库的串口中断任意长度接收 1 前言 2 回调函数 3 HAL库中断接收函数使用 1 前言 HAL即硬件抽象层 英语 Hardware Abstraction Layer 实现了不同硬件的统一接口操作 这就极大的简化
  • 极简Json格式剖析与fastjson下载和使用

    Json存在的意义 Json主要用来做数据的传输 例如发送java中的一个对象 由于对象是存储在内存里的 不能直接将内存里的对象发送出去 这时需要使用序列化 持久化 手段 将对象转换为一系列字符串 比如说Json 在字符串送达目的地时再使用
  • HTTP协议和Tomcat服务器

    目录 1 HTTP 是什么 2 HTTP 工作过程 2 1 HTTP 协议格式 2 1 1 抓包工具的使用 2 1 2 抓包工具原理 2 1 3 抓包结果分析 2 1 4 协议格式总结 3 HTTP 请求 Request 3 1 请求地址
  • 常用的数组方法整理

    常用的数组方法 1 concat 2 join 3 pop 4 shift 5 unshift 7 reverse 8 sort 9 slice 10 splice 11 toString 12 valueOf 13 IndexOf 14
  • 二、Vue3跨组件调用函数[mitt]

    一 跨组件调用函数 安装 npm install mitt 创建文件并写入 bus js import mitt from mitt export const eventBus mitt 使用方法 import eventBus from
  • 2022年6月8日STM32——SPI读写串行FLASH 和 串行FLASH文件系统FatFs

    此内容是为自己方便回忆 如有错误 欢迎指导 内容来源于野火指南者开发板教程 一 SPI读写串行FLASH SPI Serial Peripheral Interface 串行外围设备接口 是高速全双工的通信总线 通讯速率较高 SPI物理层
  • VS2019中文输出乱码解决方法(C语言)

    现象 VS2019控制台输出中文乱码 第一种解决方法 安装插件Format on Save重启VS2019生效 注意 别装错了 刚开始我就装错了这个UTF 8 No BOM 装了这个插件的同学 记得要删掉 不然还是会出现问题 第二种解决方法
  • 等价类

    动态测试方法是指通过运行被测程序 检查运行结果与预期结果的差异 并分析运行效率 正确性和健壮性等性能 这种方法由三部分组成 构造测试用例 执行程序 分析程序的输出结果 静态方法是指不运行被测程序本身 仅通过分析或检查源程序的语法 结构 过程
  • 无线通信原理之OFDM技术

    补充一个完整的OFDM系统结构图 包括收发天线 目录 1 OFDM的基本原理 2 OFDM系统模型 3 循环前缀和导频 4 OFDM系统参数 1 OFDM的基本原理 OFDM即正交频分复用 Orthogonal Frequency Divi
  • React-错误边界与组件通信方式概述

    错误边界 错误边界 Error boundary 用来捕获后代组件错误 渲染出备用页面 注意 只在生产环境 项目上线 起效 特点 只能捕获后代组件生命周期产生的错误 不能捕获自己组件产生的错误和其他组件在合成事件 定时器中产生的错误 简单理
  • DevOps是什么

    DevOps 英文Development和Operations的组合 是一组过程 方法与系统的统称 用于促进开发 应用程序 软件工程 技术运营和质量保障 QA 部门之间的沟通 协作与整合 它的出现是由于软件行业日益清晰地认识到 为了按时交付
  • JavaBean SpringBean是对象还是类

    JavaBean SpringBean是对象还是类 什么是JavaBean 什么是SpringBean 首先先说结论 Bean可以理解为对象 这几天在学习Spring源码的时候 观察到底层反复的对Bean的操作 于是就去网上搜索Bean到底
  • JAVA小程序微信支付

    微信支付有专门的文档 https pay weixin qq com wiki doc api wxa wxa api php chapter 9 1 当时找的时候都是前台如何 后来才发现后台需要做的就是统一下单 一 先到微信下载两个证书
  • java实现冒泡排序,直接插入排序,选择排序,希尔排序,以及求出它们的时间复杂度O(n)

    package com yg sort author GeQiLin date 2020 2 25 16 53 import java util Arrays public class Sort1 private static int ma