python堆排序求topn_堆排序和topN算法

堆排序和topN算法:

topN算法,第一次调用topN,然后把海量数据一次和小顶堆第一个比较,如果>第一个元素,就交换,然后调用minHeapify方法排序一遍。

然后比较下一个数据。

public class HeapSortAndTopN {

public static void main(String[] args) {

int[] arr = new int[]{3,5,3,0,8,6,1,5,8,6,2,4,9,4,7,0,1,8,9,7,3,1,2,5,9,7,4,0,2,6};

new HeapSortAndTopN().sort(arr);

System.out.println(Arrays.toString(arr));

}

public void sort(int[] a) {

int len = a.length;

int firstNonLeafIndex = (len - 2)/2;

for(int i = firstNonLeafIndex; i >=0 ; i --) {

maxHeapify(a,len,i);

}

for(int j = len - 1; j > 0 ; j --) {

swap(a,j,0);

maxHeapify(a,j,0);

}

}

private void maxHeapify(int[] a, int len, int subTreeNodeMax) {

int left = subTreeNodeMax * 2 + 1;

int right = subTreeNodeMax * 2 + 2;

int maxIndex = subTreeNodeMax;

if(left < len && a[left] > a[maxIndex]) {

maxIndex = left;

}

if(right < len && a[right] > a[maxIndex]) {

maxIndex = right;

}

if(maxIndex != subTreeNodeMax) {

swap(a, maxIndex, subTreeNodeMax);

maxHeapify(a, len, maxIndex);

}

}

private void minHeapify(int[] a, int len, int subTreeNodeMax) {

int left = subTreeNodeMax * 2 + 1;

int right = subTreeNodeMax * 2 + 2;

int maxIndex = subTreeNodeMax;

if(left < len && a[left] < a[maxIndex]) {

maxIndex = left;

}

if(right < len && a[right] < a[maxIndex]) {

maxIndex = right;

}

if(maxIndex != subTreeNodeMax) {

swap(a, maxIndex, subTreeNodeMax);

maxHeapify(a, len, maxIndex);

}

}

private void swap(int[] a, int i, int j) {

int t = a[i];

a[i] = a[j];

a[j] = t;

}

public int[] topN(int[] array) {

if(array != null && array.length > 0) {

int arrayLen = array.length;

int firtNonLeafIndex = (arrayLen - 2) / 2;

for(int i = firtNonLeafIndex; i >= 0 ; i --) {

minHeapify(array, arrayLen, i);

}

}

return array;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值