日期:2014-05-20 浏览次数:20885 次
package com.suanfa;
public class QuickSort {
/**
* 快速排序的实现
* @param args
*/
//用于快速排序的子数组的排序
public static int partition (int [] array, int front, int tail){
int middle; //用于保存中间位置
int pivot; //保存枢轴的位置
int boundary; //保存边界位置
int temp ; //用于保存临时值,用于值交换
middle =(front + tail)/2; //获取中间值
//1.用于将枢轴与子数组的做后一个数据项交换
pivot = array[middle];
array[middle] = array[tail];
array[tail] = pivot;
//2.设置边界,在数组的前面
boundary = front;
//3.遍历子数组,
for( int i = front; i<tail; i++){
if(array[i]<pivot){
//4.如果当前元素小于枢轴,则将该元素和边界交换,并将交换后的边界往后移动一位
temp = array[boundary];
array[boundary] = array[i];
array[i] = temp;
boundary++;
}
}
//最后把边界和子数组的最后一个元素交换
temp = array[tail];
array[tail] = array[boundary];
array[boundary] = temp;
return boundary;
}
public static void quickSort(int [] array, int front, int tail){
if(front<tail){
int pivotPosition = partition(array, front ,tail);
//使用递归实现子数组的划分,每次根据不同的边界来划分
// 划分左数组
quickSort(array, front, pivotPosition-1);
//划分右数组
quickSort(array, pivotPosition+1, tail);
}
}
}
------解决方案--------------------
如果文件记录建了索引(如B+索引),获取TOPN条数据是很简单的事。
在没有索引的情况下,一般的做法是通过容量固定的最大堆或最小堆筛选出TOPN条数据。
------解决方案--------------------
分次读啊
每次读100万条 留下最大的1万条
清缓存 可是JAVA不能人为主动释放内存
在读下100万条 再留下最大的1万条
如此反复
------解决方案--------------------
这种大数据量的东西,基本上都是用分布式的方法来实现的。
两个步骤: 分治 、 归并
先将这3亿的数据分给 n台机器,每台机器处理3亿/n个,找到其中的前1万。
两两机器归并,最终找出最终解。
这其中一个manager computer负责分治和归并的逻辑。