小顶堆使用(数组模拟)

查找一个数组中最大的十个数据。
首先我写了一个快速排序的方法:
public class quickSort {
/**
* 以第一个数据为标准,小的放在右边,大的放在左边
* @param t 要排序的数据,默认从小到大排
* @param left 数据的下界
* @param right 数据的上届
*/
public static void QuickSort(int t[],int left,int right){
int i=left,j=right;
if(i>=j) return;//若有变的下标不小于左边,结束返回。
int temp=t[i];
while(i<j){
while(i<j&&t[j]>=temp) j--;//找到左边比第一个数据要小的数据
if(i<j) t[i]=t[j];//将其赋值给相应的右边数据
while(i<j&&t[i]<=temp) i++;//找左边比第一个数据要大的
if(i<j) t[j]=t[i];//将数据赋给右边
}
t[i]=temp;
QuickSort( t,left,i-1);//递归
QuickSort( t,i+1,right);


}
}
然后写了另一个利用小顶堆来找最大的的是个数据的方法
import java.util.Random;
import java.util.Scanner;

public class search {


public static void main(String[] args){
Random ran=new Random();
int t[]=new int[11];
int a[]=new int[101];
for(int i=1;i<101;i++){
a[i]=ran.nextInt(1000);
}
for(int i=1;i<11;i++){
t[i]=a[i];
}
quickSort.QuickSort(t,1,10);
for(int j=11;j<101;j++){
if(t[1]<a[j]){
t[1]=a[j];
priority(t,1);
}
}
for(int i=1;i<11;i++){
System.out.print(t[i]+" ");
}
/*System.out.println("");
for(int i=1;i<101;i++){
System.out.print(a[i]+" ");
}*/


}
/**
* 安小顶堆的方式递归数组得到最小的数
* @param t 数组
* @param q 数组下标
*/
public static void priority(int t[],int q){
if(q>=6)return;
int k,p,g,i,j;
if(q<5){
k=q;
p=2*q;
g=0;
i=t[k]-t[p];
j=t[k]-t[p+1];
if(i<=0&&j<=0) return;

if(i>0||j>0){

if(i>0&&j<0){
t[k]=t[k]+t[p];
t[p]=t[k]-t[p];
t[k]=t[k]-t[p];
g=p;
}
if(j>0&&i<0){
t[k]=t[k]+t[p+1];
t[p+1]=t[k]-t[p+1];
t[k]=t[k]-t[p+1];
g=p+1;
}
if(i>0&&j>0){
if(i>j){
t[k]=t[k]+t[p];
t[p]=t[k]-t[p];
t[k]=t[k]-t[p];
g=p;
}
if(i<=j){
t[k]=t[k]+t[p+1];
t[p+1]=t[k]-t[p+1];
t[k]=t[k]-t[p+1];
g=p+1;
}
}
}
priority(t,g);
}else{
k=q;
p=2*q;
if(t[k]>t[p]){
t[k]=t[k]+t[p];
t[p]=t[k]-t[p];
t[k]=t[k]-t[p];
return;
}else{
return;
}
}





}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值