Lintcode 464. 整数排序 II 冒泡排序三种实现 直接插入排序 直接选择排序 java

2023-11-16

一.冒泡排序

实现思路:https://blog.csdn.net/morewindows/article/details/6657829
Lintcode:https://www.lintcode.com/problem/sort-integers-ii/description

冒泡第一种

  1. 冒泡排序是非常容易理解和实现,,以从小到大排序举例:

设数组长度为N。

1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。

2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。

3.N=N-1,如果N不为0就重复前面二步,否则排序完成。
按照此代码 编写,在LintCode 运行超时,这道题目是nlgN的时间复杂度,冒泡不行,A了80多
这里写图片描述

public class Solution {
    /**
     * @param A: an integer array
     * @return: nothing
     */
    public void sortIntegers2(int[] A) {
        // write your code here
        BuddleSort(A);
    }
    public void BuddleSort(int [] A)
    {
        for(int i=A.length-1;i>0;i--)
        {
            for(int j=0;j<i;j++)
            {
                if(A[j] > A[j+1])
                {
                    int temp = A[j];
                    A[j] = A[j+1];
                    A[j+1] = temp;
                }
            }
        }
    }
}

冒泡第二种优化方法

下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成
运行结果与第一种一样,超时,看来优化还是不给力

public class Solution {
    /**
     * @param A: an integer array
     * @return: nothing
     */
    public void sortIntegers2(int[] A) {
        // write your code here
        BuddleSort(A);
    }
    public void BuddleSort(int [] A)
    {
        boolean flag = false;
        for(int i=A.length-1;i>0;i--)
        {
            flag = false;
            for(int j=0;j<i;j++)
            {

                if(A[j] > A[j+1])
                {
                    int temp = A[j];
                    A[j] = A[j+1];
                    A[j+1] = temp;
                    flag = true;
                }
            }
            if(flag == false)
                return;
        }
    }
}

冒泡的第三种优化

再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。
依旧只A了83%,果然冒泡的时间复杂度是无法A这道题的
说一下我的代码思路:只有在冒泡的过程中发生了交换也就是flagSwap = true,那么才说明在索引j与j+1这两个数发生了交换,才标记j+1这个索引(flag =j+1),如果没发生交换的话,依旧令i=flag会发生循环无法跳出的情况,因为没有交换,flag的值没有变化,如果令i=flag那么会一直重复没有交换,i=flag这个过程,i就一直无法为0结束这个循环,会发生运行时超时的错误,附上我的错误代码,供大家理解我刚才说的话的意思。
这里写图片描述
代码:

public class Solution {
    /**
     * @param A: an integer array
     * @return: nothing
     */
    public void sortIntegers2(int[] A) {
        // write your code here
        BuddleSort(A);
    }
    public static void BuddleSort(int [] A)
    {
        int flag = -1;
        boolean flagSwap = false;
        for(int i=A.length-1;i>0;i--)
        {
            flagSwap = false;
            for(int j=0;j<i;j++)
            {

                if(A[j] > A[j+1])
                {
                    int temp = A[j];
                    A[j] = A[j+1];
                    A[j+1] = temp;
                    flag = j+1;
                    flagSwap = true;
                }
            }
            if(flagSwap)
                i = flag;
        }
    }
}

错误代码

    public static void BuddleSort(int [] A)
    {
        int flag = -1;
        for(int i=A.length-1;i>0;i--)
        {
            for(int j=0;j<i;j++)
            {

                if(A[j] > A[j+1])
                {
                    int temp = A[j];
                    A[j] = A[j+1];
                    A[j+1] = temp;
                    flag = j+1;
                }
            }
            System.out.println(i + " " + flag+ Arrays.toString(A));
            i = flag;
        }
    }

用例,[1, 1, 2, 3, 4, 7, 8, 9],这样会会一直卡死在i=1,flag=2,然后i=flag i = 2然后在for循环中i减一变成1,然后没交换flag还是2,i=flag这样重复这个过程。

直接插入排序

参考链接:https://blog.csdn.net/morewindows/article/details/6665714
最终AC了94%,时间复杂度还是高啊
这里写图片描述
附上代码:

public class Solution {
    public void sortIntegers2(int[] A) {
        InsertSort(A);
    }
    public void InsertSort(int[] A)
    {
        int i,j,k;
        for(i=1;i<A.length;i++)
        {
            for(j=i-1;j>=0;j--)
            {
                if(A[j] <= A[i])//寻找第一个小于A[i]的位置,也就是[i]该插入的地方
                    break;
            }
            if(j != i-1) //这个判断的意思是如果是刚好A[i-1]这个地方小于A[i],那么不需要操作
            {
                int temp = A[i];
                for(k=i-1;k>j;k--)
                    A[k+1] = A[k];
                A[k+1] = temp;//循环结束k=j,故需要k+1放在该放的位置上
            }
        }
    }
}

直接选择排序

参考链接:https://blog.csdn.net/morewindows/article/details/6671824
时间复杂度不够,只A了89%
代码:

public class Solution {
    public void sortIntegers2(int[] A) {
        SelectSort(A);
    }
    public void SelectSort(int[] A)
    {
        for(int i=0;i<A.length;i++)
        {
            int minIndex = i;
            for(int j=i;j<A.length;j++)
            {
                if(A[j] < A[minIndex])
                    minIndex = j;
            }
            int temp = A[i];
            A[i] = A[minIndex];
            A[minIndex] = temp;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lintcode 464. 整数排序 II 冒泡排序三种实现 直接插入排序 直接选择排序 java 的相关文章

  • 003 C++基础篇

    前言 大家好 本文将会向您介绍引用 定义 使用场景 引用与值分别作为返回值和参数时的性能比较 引用的权限 引用 一 引用是什么 引用 定义一个变量的别名 不是新定义一个变量 而是给已经存在的变量取了一个别名 编译器不会为引用变量单独开辟一个
  • WPF应用程序最小化到系统托盘

    using System using System Collections Generic using System ComponentModel using System Windows using System Windows Inpu
  • Unity3D跑酷游戏开发-游戏结束分数排名当前高能显示 (原创教程)

    一般游戏结束后都会有个分数排名板 接下来让分析这功能 1 游戏结束后显示高分排列 当前玩家分数高能显示 如果能进入排名板 2 数据必须持久化 切换场景 关闭开启游戏都要能用 流程 游戏结束后 调出排名板 1 取得上次的所有排名数据保存到li
  • elasticsearch查询

    环境 es1 3 eclipse jdk1 8 问题 刚开始用游标查询 再用游标获取数据 查询耗时较慢 解决办法 不使用游标查询 直接根据条件查询 es查询参考网址 https www cnblogs com chenyuanbo p 10
  • 数据库内连接、左外连接、右外连接中的on、and、where条件使用

    数据库各种连接方式的on and where条件使用 文章目录 前言 使用on条件 A为主表 使用on条件 B为主表 使用on and主表条件 使用on where主表条件 使用on and条件 a type lt gt 1 使用on wh
  • GOME-2 SIF 数据链接

    目录 一 xiao Jinfeng 文章GOME 2 SIF 数据链接 网站 说明 引用 网页预览 一 xiao Jinfeng 文章GOME 2 SIF 数据链接 网站 https acd ext gsfc nasa gov People
  • 支持向量机算法(SVM)详细讲解(含手推公式)(《机器学习》--周志华)

    前言 本人是一个本科到研究生都坚持本专业的人 但是 本科时间被狗吃了 目前还是小白一只 曾经以为考研之后要继续学习一技之长找个工作养活自己 当然 现在发现这都是自己想太多了 哈哈哈 读研之后才知道基础不好的人学习起来是多么困难 但是 既然选
  • 深度学习实战:使用 PyTorch 和序列到序列(Seq2Seq)模型进行机器翻译

    机器翻译是自然语言处理中的一个重要任务 它涉及将一种语言的文本转换为另一种语言的文本 序列到序列 Seq2Seq 模型是一种强大的深度学习模型 用于处理机器翻译任务 在本篇博客中 我们将使用 PyTorch 和 Seq2Seq 模型进行机器
  • 我00后,会Python,月薪5000,兼职1.5w

    当代年轻人的终极烦恼 没钱 主业收入不高但处处都要花钱 特别是今年以来 很多人会在后台问我 做些什么副业好 兼职写文 不知道上哪儿找单 自己也不一定写得好 做wei商 被朋友屏蔽 没有客源也出不了单 摆地摊 东西卖不出去反而倒贴了一笔钱 淘
  • vue中实现点击展开和收起功能(具有动画效果)

    vue中实现点击展开和收起功能 具有动画效果 html div class marketplace aside b div class marketplace aside show that item text div div
  • 一个好玩的小游戏——麻神之战

    题目 一种新的麻将 只留下一种花色 并且除去了一些特殊和牌方式 例如七对子等 规则如下 共有36张牌 每张牌是1 9 每个数字4张牌 你手里有其中的14张牌 如果这14张牌满足如下条件 即算作和牌 14张牌中有2张相同数字的牌 称为雀头 除
  • Java 同步JSON字符串至ES(Elasticsearch) 添加时间戳(@timestamp)、版本(@version) 字段

    解决方法 仿照logstash同步原理 对于同步json字符串 首先将其解析 然后添加时间戳和版本字段 或其他字段 打入es public void insertEs String jsonStr JSONObject jsonObject
  • 95-36-210-ChannelHandler-系统Channel-TimeoutHandler

    文章目录 1 概述 2 继承体系 3 IdleStateHandler 3 1 典型构造方法 3 2 初始化方法 initialize 3 3 销毁方法destroy 3 4 核心的调度任务 ReaderIdleTimeoutTask 1
  • QT的补充知识

    一 文件 QFile QT提供了QFile类用于对文件进行读写操作 也提供了其他的两个类 文本流 QTextSream 和数据流 QDataStream 文本流 QTextSream 用于对文本数据的处理 并且是以字为单位进行读 写 数据流
  • 获取执行计划——使用动态性能视图和AWR、Statspacks

    上一篇中讲了如何使用EXPLAIN PLAN方法来获取sql执行计划 这篇继续讲另两种方法 使用动态性能视图和AWR报告 一 使用动态性能视图 查询动态性能视图我们可以获取丰富的信息 包括执行计划与游标信息等等 下面罗列几个常用的v 视图
  • Python IDLE 自动提示功能

    Python27 Lib idlelib 目录下 config extensions def文件修改等待时间 AutoComplete enable 1 popupwait 2000 2000表示2秒 修改为0 AutoComplete p

随机推荐

  • 分享一个页面

    先看效果 看下代码
  • 34. 注入篇——Cookie注入

    Cookie注入原理 1 数据读取流程 对于WEB服务器而言 读取数据的流程是先取GET中的数据 如果GET中没有数据信息 那么再取POST中的数据 如果POST中也没有那么就会去取COOKIE中的数据 2 防注入系统的常例 系统一般只会对
  • flutter两个非常常用的布局小空间SizedBox和Divider

    SizedBox SizedBox是Flutter中的一个小部件 widget 用于创建具有指定尺寸的空白框 它通常用于调整和控制布局中的间距 大小和位置 SizedBox具有以下常用属性 width 指定SizedBox的宽度 heigh
  • Redis 五大基础数据结构命令详细介绍

    文章目录 一 Redis数据结构 二 Redis通用命令 三 String类型 3 1 String类型 也就是字符串类型 是Redis中最简单的存储类型 3 2 String类型的常见命令 四 Redis key的层级格式 4 1 key
  • GPT发家史

    如今 ML 领域公号也卷得厉害 最早我 reddit 灌灌水 邮件看看 就有东西写了也不怕重 现在基本上能第一眼看到的东西肯定还没动手大号们就发完了 前段时间 DALL E 刚出 果然还没动手写 无数文章就给介绍完了 对个人而言 要写的话要
  • mysql之分页查询14

    1 分页查询 分页查询比较简单 主要是使用limit关键字去分页 一般理解分页公式limit page 1 size size 即可 进阶8 分页查询 应用场景 当要显示的数据 一页显示不全 需要分页提交sql请求 语法 select 查询
  • 【Git】Git切换地址

    如何切换git代码地址 1 查看当前远程 url git remote v 执行命令后 可以看见当前有2个URL 远程 URL 在一般情况下有两个 分别是 fetch 和 push fetch URL 是用于从远程仓库获取最新版本的数据 当
  • Java面向对象进阶&继承

    1 继承 1 1 继承的实现 继承的概念 继承是面向对象三大特征之一 可以使得子类具有父类的属性和方法 还可以在子类中重新定义 以及追加属性和方法 实现继承的格式 继承通过extends实现 格式 class 子类 extends 父类 举
  • 水仙花数(Java语言)——最基础全面的讲解

    题目 判读一个整数是否是水仙花数 所谓水仙花数是一个三位数 其各个位上数字立方和等于它本身 例如 153 1 1 1 3 3 3 5 5 5 首先进行思路分析 1 首先要得到此数百位 十位 个位上的数字 然后用 if 判断他们的立方和是否相
  • 数据库锁表?别慌,本文教你如何解决

    引言 作为开发人员 我们经常会和数据库打交道 当我们对数据库进行修改操作的时候 例如添加字段 更新记录等 没有正确评估该表在这一时刻的使用频率 直接进行修改 致使修改操作长时间无法响应 造成锁表 在 mysql 中 如果出现 alter 操
  • flink中AggregateFunction 执行步骤以及含义全网详细解释

    package operator import org apache flink api common functions AggregateFunction import org apache flink api common funct
  • 我对 Kubernetes 的片面理解 —— 基础篇(持续更新中)

    Kubernetes 为何让我如此着迷 Kubernetes 的高矮胖瘦 介绍 Kubernetes 功能 Kubernetes 边界 声明式的配置 创建 Deployment 更新 Deployment 回滚 Deployment Kub
  • Python 3.9.0 已经可以下载了,但不支持win7和更低的系统版本!

    python3 9 0最近在官网可以下载了 而3 10 0a1已经开始测试了 根据python官网的说法 python3 9 0将不再支持win7或者win7以前的系统 下载来试了一下 win7果然不支持了 安装时报错 3 9的一些新功能
  • MongoDb随笔,PyMongo简单使用

    安装MongoDb 更新2021 07 06 https www mongodb com try download community 下载对应系统的软件版本 CentOS7 9 mongod 4 4 6 rpm ivh mongodb o
  • VSCode:Remote-SSH配置实录

    转自 VSCode Remote SSH配置实录 六天 CSDN博客 也可以通过这样一步步输入用户名和密码链接 为什么要使用VSCode Remote SSH 服务器很多时候都是部署在Linux远程机器上的 我们通常是SSH连过去然后用vi
  • JDBC——BasicDAO

    为什么要有 BasicDAO apache dbutils Druid 简化了 JDBC 开发 但还有不足 SQL语句是固定 不能通过参数传入 通用性不好 需要进行改进 更方便执行增删改查 对于 select 操作 如果有返回值 返回类型不
  • Putty配色方案(转)

    平时用Putty的频率相对挺高的 每次装完系统或是怎么的都得重新配色 还得百度去找配色表 每次太麻烦了 特地转载一篇好看的配色表供以后长期使用 以下内容为转载内容 使用的是修改注册表的方法 1 打开注册表 运行 regedit 2 找到对应
  • matlab仿真实例100题_输入-输出反馈线性化(Feedback linearization)控制算法Matlab仿真实例...

    反馈线性化 Feedback linearization 可能是大部分人接触非线性控制之后学习的第一种控制方法 个人认为主要优点有两点 一 它的理解和实现都相对简单 二 它能让非线性系统的转换为线性系统 这样接下来 就可以直接套用线性系统中
  • SQLEXPRESS服务无法启动

    一 软件版本 SQL Sever2014 localdb MSSQLLocalDB SQLServer13 0 VS2015 二 问题描述 由于使用web API中的odata编程 在工程中使用的是 localdb MSSQLLocalDB
  • Lintcode 464. 整数排序 II 冒泡排序三种实现 直接插入排序 直接选择排序 java

    一 冒泡排序 实现思路 https blog csdn net morewindows article details 6657829 Lintcode https www lintcode com problem sort integer