对于数据排序大家肯定见过不少,选择排序或者冒泡排序等等,今天我们要做的是快速排序 + 直接插入排序来对大数据(1000万以上)进行排序,下面我们分别来看看这两种排序规则

1, 直接插入排序

(1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排

好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数

也是排好顺序的。如此反复循环,直到全部排好顺序。直接插入排序这块儿是有技巧的,网上很多文章是当前元素和前面已经排序好的元素进行挨个对比,找到位置然后进行数组移位,这样在数据量很小的情况下没有什么,但是在大数据面前就显得比较鸡肋了,多次循环很消耗时间资源,那么我们可以采用二分查找法对当前元素的位置进行快速定位,速度就会快很多,处理大数据起来也是比较快的

(2)实例

2.快速排序

(1)基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

(2)实例:

好,相信大家看了上面的两种排序的方法已经心中有数了,那么面对1000万这样的大数组来说我们如何处理,现在好多大数据处理想速度快牢记四个字:分而治之,也就是说我们可以将一个很大的数据拆分成多个很小的部分,这样将计算好的部分结果统计在一起,这样就可以有效的避免操作大数据对内存CPU硬盘等的消耗,下面来说说我们具体的方案

1、数据拆分

采用快速排序的算法将大数据拆分成两个(左,右)小部分数据,因为上面快排左侧的数据都是小于右侧的数据,那么对左侧的数据进行排序再对右侧的数据进行排序,将结果合并在一起就是我们想要的结果

2、排序

将第一步左右侧数据进行多次数据拆分之后,会生成多个数据片的,当这个数据片的长度小于固定的长度的时候,这时候就可以对它进行排序了,这里的排序我们采用二分查找+数组移位(效率要比冒泡,选择排序等快很多)

3、合并

当数据快都已经排序好了之后,将排序好的小部分数据合并在一起,那么最终我们的大数组就已经排序完了.

package ss;

import java.util.Arrays;
import java.util.Random; public class Sort { //分片数组长度为多少时,开始排序
public final static int SORT_NUM = 50; //数组的长度
public final static int ARRAY_NUM = 10000000; public static void main(String[] args) { //声明数组长度
int[] array = new int[ARRAY_NUM]; //生成随机数据
for (int j = 0; j < ARRAY_NUM; j++) {
array[j] = new Random().nextInt(Integer.MAX_VALUE);
} //复制数组,采用JDK自带排序
int[] arrayCopy = new int[ARRAY_NUM]; System.arraycopy(array, 0, arrayCopy, 0, ARRAY_NUM); //数据少的时候可以看看初始化结果,数据量大,ecplise直接就崩溃了。
//System.out.println("init :"+Arrays.toString(array));
long time1 = System.currentTimeMillis();
sort(array,0,array.length);
long time2 = System.currentTimeMillis();
//System.out.println(Arrays.toString(array));
System.out.println(time2 - time1);
Arrays.sort(arrayCopy);
long time3 = System.currentTimeMillis();
System.out.println(time3 - time2); } public static void sort(int[] array,int begin,int end){ //若排序部门长度小于SORT_NUM
if(end - begin<=SORT_NUM){ //循环排序部分的元素
for (int i = begin+1; i < end; i++) { //查找当前元素的位置
int index = findIndex(array[i], begin, i - 1, array); //获取当前元素
int value = array[i]; //数组移位
System.arraycopy(array, index, array, index + 1, i - index); //将当前数组插入到合适的位置
array[index] = value;
}
return;
} //作为中间轴参数使用
int temp = array[begin]; //获取当前的位置
int currentIndex = begin; int left =begin;
int right=end-1; while(left<right){ //向右比较
for(;left < right;right--){
if(left < right && array[right]<temp){
swap(array,currentIndex,right);
currentIndex = right;
left++;
break;
}
} //向左比较
for(;left < right;left++){
if(left < right && array[left]>temp){
swap(array,currentIndex,left);
currentIndex = left;
right--;
break;
}
}
} //左侧排序
sort(array,begin,currentIndex+1);
//右侧排序
sort(array,currentIndex+1,end); } public static void swap(int[] array,int index1,int index2){
int temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
} //二分查找排序
public static int findIndex(int thisval, int from, int to, int[] sortArray) { int index = 0; //当左侧数据大于当前数据,返回from的索引
if (sortArray[from] >= thisval) {
index = from;
return index;
} //当右侧数据小于当前数据,返回index后面的索引
if (sortArray[to] <= thisval) {
index = to + 1;
return index;
} if (to - from == 1) {
return to;
} //获取from和to的中间值
int middle = (to - from) / 2 + from; //判断当前值在左侧还是右侧
if (sortArray[middle] >= thisval) {
//左侧
return findIndex(thisval, from, middle, sortArray);
} else {
//右侧
return findIndex(thisval, middle, to, sortArray);
}
} }

看一下最后我们执行的时间,大约是1000万条随机的数据,我门排序的时间的大约是1秒多一些,JDK1.7自带的Arrays.sort()大约不到1秒,JDK1.7中的排序规则是按照数据的不同内部采用了多种不同的排序规则,但是大体来说思路是一样的,对知识的不断探索和学习是进阶的必要条件,不要傻乎乎的再用冒泡排序了

  

JAVA大数据数组排序的更多相关文章

  1. JAVA 大数据内存耗用测试

    JAVA 大数据内存耗用测试import java.lang.management.ManagementFactory;import java.lang.management.MemoryMXBean ...

  2. Java大数据应用领域及就业方向

    最难毕业季,2017高校毕业生达到795万,许多学生面临着毕业即失业的尴尬.面对着与日俱增的竞争形势和就业压力,很多毕业生选择去知了堂学习社区镀金,以提高自己的就业竞争力,其中Java大数据是学生选择 ...

  3. 为什么Java大数据是最火爆的编程语言?

    未来10年将是大数据,人工智能爆发的时代,到时将会有大量的企业需要借助大数据,而Java最大的优势就是它在大数据领域的地位,目前很多的大数据架构都是通过Java来完成的. 在这个Android.iOS ...

  4. Java大数据人才应用领域广,就业薪酬高

    互联网创造了大数据应用的规模化环境,大数据应用成功的案例大都是在互联网上发生的, 互联网业务提供了数据,互联网企业开发了处理软件,互联网企业的创新带来了大数据应用 的活跃,没有互联网便没有今天的大数据 ...

  5. 如何学好Java大数据并快速提升

    Java作为一种最流行的,最热门的编程语言,可以说它无处不在,目前全球有着数十亿的设备正在运行着Java,很多服务器程序都是用Java编写,用以处理每天超过数以千万的数据.无论是手机软件.手机Java ...

  6. 原来Java大数据才是真正的高富帅!

    大数据时代,中国IT环境也将面临重新洗牌,不仅仅是企业,更是程序员们转型可遇而不可求的机遇. 国内大多数大型互联网公司的程序员被称作研发工程师,但实际上国内几乎没有研发项目,只能叫做开发.开发程序员的 ...

  7. 42步进阶学习—让你成为优秀的Java大数据科学家!

    作者 灯塔大数据 本文转自公众号灯塔大数据(DTbigdata),转载需授权 如果你对各种数据类的科学课题感兴趣,你就来对地方了.本文将给大家介绍让你成为优秀数据科学家的42个步骤.深入掌握数据准备, ...

  8. 为什么Java大数据能带你走上人生巅峰

    国内大多数大型互联网公司的程序员被称作研发工程师,但实际上国内几乎没有研发项目,只能叫做开发. 开发程序员的工作大多是重复性劳动,容易产生疲惫感,薪资在工作2-5年内就达到了一个峰值,再要提升就比较困 ...

  9. java大数据量调优

    从总体上来看,对于大型网站,比如门户网站,在面对大量用户访问.高并发请求方面,基本的解决方案集中在这样几个环节:1.首先需要解决网络带宽和Web请求的高并发,需要合理的加大服务器和带宽的投入,并且需要 ...

随机推荐

  1. Java获取本机的IP与MAC地址

    有些机器有许多虚拟的网卡,获取IP地址时会出现一些意外,所以需要一些验证: // 获取mac地址 public static String getMacAddress() { try { Enumer ...

  2. 【iOS10 SpeechRecognition】语音识别 现说现译的最佳实践

    首先想强调一下“语音识别”四个字字面意义上的需求:用户说话然后马上把用户说的话转成文字显示!,这才是开发者真正需要的功能. 做需求之前其实是先谷歌百度一下看有没有造好的轮子直接用,结果真的很呵呵,都是 ...

  3. VS2015墙内创建ionic2

    开始学习ionic2,试验各种方法,感觉以下是紧跟rc版本的最佳方案 STEP1 设置cnpm npm install -g cnpm --registry=https://registry.npm. ...

  4. centos6和centos7防火墙的关闭

    CentOS6.5查看防火墙的状态: [zh@localhost ~]$service iptable status 显示结果: [zh@localhost ~]$service iptable st ...

  5. 使用win10远程控制ubuntu16.04

    使用win10远程控制ubuntu16.04,网上很多需要安装xfce桌面的.今天介绍一下,不需要安装其他桌面,使用Ubuntu16.04自带桌面,漂亮美观. Ubuntu16.04端: 1.打开终端 ...

  6. 智能头盔 "Livall携全球首款智能骑行头盔亮相CES"

    LIVALL是全球首创集音乐.通讯.智能灯光为一体的智能骑行头盔的研发者,日前Livall携旗下智能骑行头盔BH 100和BH 60参展CES 2017,这也是目前世全球首款智能骑行头盔类产品,同时亮 ...

  7. 使用MonoTouch.Dialog简化iOS界面开发

    MonoTouch.Dialog简称MT.D,是Xamarin.iOS的一个RAD工具包.它提供易于使用的声明式API,不需要使用导航控制器.表格等ViewController来定义复杂的应用程序UI ...

  8. MySql 死锁时的一种解决办法

    转自:http://blog.csdn.net/mchdba/article/details/38313881 之前也遇到一次,今天又遇到了这个问题,所以这次必须解决,网上找到这篇文章帮了大忙,方便以 ...

  9. Direct3D Draw函数 异步调用原理解析

    概述 在D3D10中,一个基本的渲染流程可分为以下步骤: 清理帧缓存: 执行若干次的绘制: 通过Device API创建所需Buffer: 通过Map/Unmap填充数据到Buffer中: 将Buff ...

  10. ASP.NET Web API Model-ValueProvider

    ASP.NET Web API Model-ValueProvider 前言 前面一篇讲解了Model元数据,Model元数据是在Model绑定中很重要的一部分,只是Model绑定中涉及的知识点比较多 ...