JAVA快速排序——亿级体量数据
来源:互联网 发布:中美贸易顺差数据 编辑:程序博客网 时间:2024/04/26 18:11
算法真的是太强大了,今天测试了给一亿个随机数据进行排序,花了67秒不到!不多说,直接见代码:
import java.util.Random;
public class sort {
public static void main(String[] args) {
int[] datas = new int[100000000];
long t1 = System.currentTimeMillis();
initData(datas);
long t2 = System.currentTimeMillis();
long t3 = t2 - t1;
System.out.println("初始化数据所用时间"+t3);
long starttime = System.currentTimeMillis();
quickSort(datas,0,datas.length - 1);
long endtime = System.currentTimeMillis();
long time = endtime - starttime;
System.out.println(time+"毫秒");
}
public static void initData(int [] datas){
for (int i = 0; i < datas.length; i++) {
datas[i] = (int) (Math.random() * 100000);
}
}
/**
*
* @param datas
* 数据
* @param left
* 数据的起始位置
* @param right
* 数据的结束位置
*/
public static void quickSort(int[] datas, int left, int right) {
// 跳出递归的条件,交叉
if (left >= right) {
return;
}
// 否则,快速排序
int middle = findMiddle(datas, left, right);
// 每一半按同样的方式排序
// 左半
quickSort(datas, left, middle - 1);
// 右半
quickSort(datas, middle + 1, right);
}
/**
* 找数据的中间位置
*
* @param datas
* @param left
* @param right
* @return
*/
private static int findMiddle(int[] datas, int left, int right) {
int middle = -1;// 中间位置
// 以最后一个数据做参照物
int temp = datas[right];
// 定义左右两个指针开始查找数据
int leftIndex = left;
int rightIndex = right - 1;
while (true) {
// 1. 左指针从左往右依次找比temp大的数据
while (leftIndex < right && datas[leftIndex] <= temp)
leftIndex++;
// 注意: 跳转循环的条件有两个: 1,leftIndex == right 2. datas[leftIndex] > temp
// 如果通过 1,leftIndex == right 跳出循环,说明参照物是最大值
if (leftIndex == right) {
middle = leftIndex;
break;
}
// 2. 右指针从右往左依次找temp小的数据
while (rightIndex >= left && datas[rightIndex] >= temp)
rightIndex--;
// 注意: 跳转循环的条件有两个: 1,rightIndex < left 2. datas[leftIndex] < temp
//如果 1,rightIndex < left 跳出循环,说明参照物是最小值,
//也是交叉,按下面代码一起处理
// 比较左右指针是否出现交叉
if (leftIndex < rightIndex) {
// 没有交叉
// 交换左右指针位置上的数据
change(datas, leftIndex, rightIndex);
// 继续循环
continue;
} else {
// 交叉
// 交换左指针和参照物的值
change(datas, leftIndex, right);
// 找到中间点(leftIndex)终止整个循环
middle = leftIndex;
break;
}
}
return middle;
}
private static void change(int[] datas, int left, int right) {
int temp = datas[left];
datas[left] = datas[right];
datas[right] = temp;
}
}
如果你看到了,下方评论告诉下我的你所用的时间,thinks!
- JAVA快速排序——亿级体量数据
- 快速排序—java
- 快速排序——java
- 快速排序——java
- 快速排序——java
- java——快速排序
- 快速排序—— java
- 快速排序—java实现
- Java排序算法——快速排序
- 排序—快速排序
- 快速排序——java实现
- 快速排序——Java实现
- 快速排序——java实现
- java算法——快速排序
- java-数据结构——快速排序
- Java算法——快速排序
- Java实现——快速排序
- 回首Java——快速排序
- bzoj 3622 容斥原理
- Fragment(碎片)(3)
- 05 Android强制设置横屏或竖屏/全屏
- mysql各个部分的执行顺序
- 如何对数据库响应变慢进行优化
- JAVA快速排序——亿级体量数据
- 数据库对数据库查询语句的处理步骤
- 结构方程-SEM R 很难搞
- mysql的查询优化器
- 坑货libmcrypt
- java用类封装的方式写简单的日历
- centos 6.5 下 安装 mysql 并实现远程登录使用
- Scala-偏函数与部分应用函数
- 求职系列笔记(1)---数据结构和算法