我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java如何排一亿个随机数

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java如何排一亿个随机数

这篇文章主要介绍Java如何排一亿个随机数,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

一、直接插入排序

1. 图解插排

思路 : 字面意义,插入是将某一元素按某种规则放入到特定集合中 ,因此我们需要将序列划分成为两块 ,一部分为有序集合, 另一部分为待排序集合

图解 :

Java如何排一亿个随机数

为了方便理解,我们就按最最最特殊的4321序列来举例,

根据上述的思路 ,我们需要将序列划分为两部分, 为了编码方便,我们将第一个元素假设为有序集合, 那么我们的循环应当是从第2个元素开始的,也就是3

为避免后面操作把3覆盖掉了 , 我们选择一个临时变量来保存3.也就是上文的 val=arr[1] ,

由于是对数组继进行操作 , 我们同时也需要获取有序集合的最后一个元素的索引作为游标

当游标不越界 , 且待插入的值小于游标指示位置时(上图的4<3) , 我们将元素4后移 , 游标前移,继续检查集合中的其它元素是否也小于待插入的元素, 直到游标越界

上图由于集合内只有一个4, 游标前移越界了, 因此循环终止. 下一轮比较开始执行

2. 代码实现

public static void insertSort(int[]arr){        for(int i = 1 ; i < arr.length; i++){            int val = arr[i];            int valIndex = i - 1; //游标            while(valIndex >= 0 && val < arr[valIndex]){ //插入的值比游标指示的值小                arr[valIndex + 1] = arr[valIndex];                valIndex--; //游标前移            }            arr[valIndex+1] = val;        }    }1234567891011

3.性能检测与时空复杂度

实际运行80w个数据耗时1分4秒(非准确值,每台机器可能都不一样)

Java如何排一亿个随机数

直接插排在排序记录较少, 关键字基本有序的情况下效率较高

时间复杂度 :

关键字比较次数 : KCN=(n^2)/2 总移动次数 : RMN= (n^2)/2

因此时间复杂度约为 O(N^2)

二、希尔排序(交换法)

1. 思路图解

Java如何排一亿个随机数

2. 代码实现

public static void shellSort(int[] arr){ //交换法        int tmp = 0;        for(int gap = arr.length / 2 ; gap > 0 ; gap /= 2){            for(int i = gap ; i < arr.length ; i++){ //先遍历所有数组                for(int j  = i - gap ; j >= 0 ; j -= gap){//开启插入排序                    if(arr[ j ] > arr[ gap + j ]){ //可以根据升降序修改大于或小于                        tmp = arr[gap + j];                        arr[j+gap] = arr[j];                        arr[j] = tmp;                    }                }            }            System.out.println(gap);            System.out.println(Arrays.toString(arr));        }    }12345678910111213141516

这里最难理解的应该是第三个for循环,j = i - gap, 表示小组内的第一个元素,即j=0,

当小组内的第一个元素大于第二个元素时(由于是逻辑上的分类,第二个元素的索引应当是第一个元素的所有值+增量gap) , 交换两者,反之j-=gap,继续比较或跳出循环 ,

如此往复将所有小组都遍历完之后 , 缩小增量(即gap/=2) , 然后继续上述步骤, 直到增量gap为1时, 序列排序结束

3. 时间复杂度

希尔排序的时间复杂度取决于增量序列的函数 , 需要具体问题具体分析,并不是一个确定的值,这也是第四点需要讨论的问题

4. 关于增量的选择

上述我们在做排序的时候增量缩减选用的时gap/=2的模型, 这并不是最优的选择 , 关于增量的选取 , 属于数学界尚未解决的一个问题

但是可以确定的是, 通过大量的实验证明 ,当n->无穷大时, 时间复杂度可以减少到 :

Java如何排一亿个随机数

在下一点, 移位法中 , 我们也做了几个实验 , 可以肯定的时,对于一定规模内(如800w~1亿) 的计算, 希尔排序的速度远远超过了堆排序, 至少在笔者的电脑上是这样的

三、希尔排序(移位法)

交换法的速度比移位法慢很多 ,因此更多的是使用地移位法,并且移位法相较于交换法, 更"像"插入排序

1. 思路

思路其实就是上述两种排序的结合 , 将分组插入的优点结合到一起, 效率非常高

体现的就是分治的思路,将一个较大序列切割成若干较小序列

Java如何排一亿个随机数

2. 代码实现

public static void shellSort02(int[] arr){ //移位法        for(int gap = arr.length/2 ; gap > 0 ; gap /= 2){ //分组            for(int i = gap ; i < arr.length ; i++){ //遍历                int valIndex = i;                int val = arr[valIndex];                if(val < arr[valIndex-gap]){ //插入的值小于组内另一个值                   while(valIndex - gap >=0 && val < arr[valIndex-gap]){ //开始插排                       // 插入                       arr[valIndex] = arr[valIndex-gap];                       valIndex -= gap; //让valIndex = valIndex-gap (游标前移)                   }                }                arr[valIndex] = val;            }        }    }12345678910111213141516

3. 实验结果

Java如何排一亿个随机数
Java如何排一亿个随机数
Java如何排一亿个随机数

以上是“Java如何排一亿个随机数”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java如何排一亿个随机数

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java如何排一亿个随机数

这篇文章主要介绍Java如何排一亿个随机数,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、直接插入排序1. 图解插排思路 : 字面意义,插入是将某一元素按某种规则放入到特定集合中 ,因此我们需要将序列划分成为两块
2023-06-25

php数组随机排序如何排

要在PHP中对数组进行随机排序,可以使用shuffle()函数。这个函数会打乱数组中元素的顺序,从而实现随机排序。以下是一个示例代码:$myArray = array("A", "B", "C", "D", "E");shuffle($m
php数组随机排序如何排
2024-03-02

Java如何随机打乱一个字符串

Java中随机打乱字符串有两种方法:Collections.shuffle()和Fisher-Yates算法。Collections.shuffle()将字符串转换为字符列表,随机排列并转换为字符串。Fisher-Yates算法通过随机交换元素实现排列。两种方法的时间复杂度均为O(n)。
Java如何随机打乱一个字符串
2024-04-02

Java如何从数组中随机取出一个或多个单元

Java提供多种方法从数组中随机取出元素:Math.random()用于生成随机索引;Random类的高级方法可获取指定范围的随机整数;List.shuffle()将数组转换为随机排序的列表;StreamsAPI包含sample()方法返回流中的随机元素;还可以创建自定义方法。选择方法时应考虑性能(较小数组用Math.random()和Random类,较大数组用StreamsAPI和自定义方法)、随机性(StreamsAPI更随机)和易用性(Math.random()和Random类最简单)。
Java如何从数组中随机取出一个或多个单元
2024-04-02

java一次怎么生成多个随机数

这篇文章主要介绍了java一次怎么生成多个随机数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java一次怎么生成多个随机数文章都会有所收获,下面我们一起来看看吧。本教程操作环境:windows7系统、java
2023-06-30

如何在java项目中实现一个随机数生产算法

如何在java项目中实现一个随机数生产算法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。java提供了Math.random()函数,返回一个double类型的随机数,也有ut
2023-05-31

java随机数如何生成

在Java中,可以使用java.util.Random类来生成随机数。以下是一些示例代码:生成一个范围在0到n之间的随机整数:import java.util.Random;public class RandomNumberGenerato
java随机数如何生成
2024-02-29

java如何生成一定范围的随机数

在Java中,可以使用`java.util.Random`类来生成一定范围的随机数。下面是一种常用的方法:1. 创建一个`Random`对象:```javaRandom random = new Random();```2. 使用`next
2023-08-24

JAVA中如何获取随机数

JAVA中如何获取随机数,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在Java中我们可以使用java.util.Random类来产生一个随机数发生器。它有两种形式的构造函数,
2023-06-03

使用java怎么一次生成多个随机数

这期内容当中小编将会给大家带来有关使用java怎么一次生成多个随机数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、
2023-06-14

JavaScript如何返回一个lower-upper直接的随机数

这篇文章主要介绍了JavaScript如何返回一个lower-upper直接的随机数,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。random:返回一个lower-upper
2023-06-03

PHP如何从数组中随机取出一个或多个单元

本文介绍了5种从PHP数组中随机取出一个或多个单元的方法:array_rand()、shuffle()、mt_rand()、rand()和自定义函数。选择哪种方法取决于具体需求,建议使用mt_rand()或自定义函数,因为它们更安全、灵活。无论选择哪种方法,本文提供的示例和指南将帮助开发者轻松实现从数组中随机抽取数据的需求。
PHP如何从数组中随机取出一个或多个单元
2024-04-02

PHP如何随机打乱一个字符串

本篇文章详细介绍了如何在PHP中随机打乱字符串。提到了三种主要方法:使用shuffle()函数、str_shuffle()函数和自定义算法(Fisher-Yatesshuffle)。文章比较了它们的性能并提供了示例,帮助您根据需要选择最合适的方法。
PHP如何随机打乱一个字符串
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录