java实现堆排序(放入数组的索引对应二叉树节点位置)、归并排序

堆排;fPos=(cPos-1)/2;lPos=fPos*2+1;rPos=fPos*2+2

public class HeapSort {
/**
* 节点K进行筛选
* @param a堆数据
* @param n有效数据个数
* @param k待筛选的K节点(这K表示的不是参与比较的数字,
* 而是所处二叉树的位置,根节点为0,左1,右2依次循环)
*/
static void heapOne(int[] a,int n,int k){

//左子节点位置
int k1=2*k+1;
//右子节点位置
int k2=2*k+2;
if (k1>=n&&k2>=n) {
return;//已经是叶子了,跳出递归的方法
}
int a1=Integer.MAX_VALUE;
int a2=Integer.MAX_VALUE;
if (k1<n) a1=a[k1];//左子值
if (k2<n) a2=a[k2];//右子值
if (a[k]<=a1&&a[k]<=a2)return;//符合堆要求,父节点比子节点都小,跳出方法
//找到左右孩子最小的和它交换
if (a1<a2) {
int t=a[k];
a[k]=a[k1];
a[k1]=t;
heapOne(a, n, k1);//继续筛选子树
}
else {
int t=a[k];
a[k]=a[k2];
a[k2]=t;
heapOne(a, n, k2);//继续筛选子树
}
}
static void heapSort(int[] a){
///建立初始堆,二叉树位置对应数组索引,从0开始,父节点=(子节点位置-1)/2,这里length-2是因为最后一个节点是length-1位置
for(int i=(a.length-1-1)/2;i>=0;i--)heapOne(a,a.length,i);//开始是最后一个非叶子节点(最后一个节点的父节点),直到根节点

//边输出堆顶边调整
int n=a.length;//剩余元素数
while (n>0) {
System.out.print(a[0]+" ");
a[0]=a[n-1];
n--;

heapOne(a, n, 0);//根节点的位置为0,每次只需从根节点开始筛选
}
}
/**
* @param args
*/
public static void main(String[] args) {
int[] a={26,29,60,60,11,15,20,75,100,500,1000,3,5,6,8,9};

heapSort(a);
}

}

归并排序


public class MergeSort {
static int[] merge(int[] a,int[] b){ 
int[] c=new int[a.length+b.length];
int ai=0;//只要能表达其位置的都可以称为指针,不一定是指向内存地址,C可能是指向内存地址
int bi=0;
int ci=0;
while (ai<a.length&&bi<b.length) {
//谁小就先添加谁
if (a[ai]<=b[bi]) {
c[ci++]=a[ai++];
}

else {
c[ci++]=b[bi++];
}
}
//判断剩余,将剩余的添加到尾部
while (ai<a.length)c[ci++]=a[ai++];
while (bi<b.length)c[ci++]=b[bi++];

return c;
}
/**
* @param args
*/
public static void main(String[] args) {
// 先给定两个有序的序列
int[] a={5,6,8,11,26,75,100};
int[] b={3,9,15,20,29,60,500,1000};
int[] c=merge(a,b);
for (int i = 0; i < c.length; i++) {
System.out.print(c[i]+",");
}

}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值