您的位置:首页 > 其它

排序之堆排序

2016-04-25 15:16 155 查看
public class HeapSort {
static int[] MakeMaxHeapUp(int a[],int i,int n){ //用于建立大顶堆,给一个父节点,判断是否满足左右子节点小于父节点
int j,temp;
j=2*i+1;
temp=a[i];
while(j<n){ //节点的位置必须存在
if(j+1<n&&a[j+1]>a[j]) //在右节点存在的条件下,满足右节点大于左节点
j++;
if(a[j]<temp) //使用子节点中较大的那一个和父节点进行比较
break;
a[i]=a[j];
i=j;
j=2*i+1;
}
a[i]=temp;
if(i>0)MakeMaxHeapUp(a, i-1, n);
return a;
}
static void MaxHeapDeleteNumber(int a[],int n){ //取出堆顶元素,即数组中 a[0]元素。
System.out.println(a[0]); //打印堆顶元素

int temp=a[0]; //将堆顶元素与最后一个元素交换。
a[0]=a[n-1];
a[n-1]=temp;
MakeMaxHeapUp(a,0,n-1); //把交换后的堆的前n-1个节点进行大顶堆操作
}
// static void MakeMaxHeapDown(int a[], int n){ //将普通数组进行堆化
// for (int i = n / 2 - 1; i >= 0; i--)
// MakeMaxHeapUp(a, i, n);
// for (int i = 0; i < a.length; i++) { //打印出堆化后的数组元素
// System.out.print(a[i]+" ");
// }
// System.out.println();
// }
public static void main(String[] args) {
int a[] = {6,10,17,8,7,9,12,1};
MakeMaxHeapUp(a,a.length/2-1,a.length);
// MakeMaxHeapDown(a,a.length);
for(int i=a.length;i>0;i--){ //进行循环n次。取出堆顶元素。即完成排序
MaxHeapDeleteNumber(a, i);
}
}
}


以上是使用递归写的堆排序。

public class HeapSort {
static void MakeMaxHeapUp(int a[],int i,int n){  //用于建立大顶堆,给一个父节点,判断是否满足左右子节点小于父节点
int j,temp;
j=2*i+1;
temp=a[i];
while(j<n){           //节点的位置必须存在
if(j+1<n&&a[j+1]>a[j])    //在右节点存在的条件下,满足右节点大于左节点
j++;
if(a[j]<temp)         //使用子节点中较大的那一个和父节点进行比较
break;
a[i]=a[j];
i=j;
j=2*i+1;
}
a[i]=temp;

}
static void MaxHeapDeleteNumber(int a[],int n){      //取出堆顶元素,即数组中 a[0]元素。
System.out.println(a[0]);     //打印堆顶元素

int temp=a[0];     //将堆顶元素与最后一个元素交换。
a[0]=a[n-1];
a[n-1]=temp;
MakeMaxHeapUp(a,0,n-1);        //把交换后的堆的前n-1个节点进行大顶堆操作
}
static void MakeMaxHeapDown(int a[], int n){  //将普通数组进行堆化
for (int i = n / 2 - 1; i >= 0; i--)
MakeMaxHeapUp(a, i, n);
for (int i = 0; i < a.length; i++) {  //打印出堆化后的数组元素
System.out.print(a[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
int a[] = {6,10,17,8,7,9,12,1};
MakeMaxHeapDown(a,a.length);
for(int i=a.length;i>0;i--){  //进行循环n次。取出堆顶元素。即完成排序
MaxHeapDeleteNumber(a, i);
}
}
}
这是没有使用递归方法的堆排序。

以上代码的逻辑是:

  1、定义一个数组,将数组进行大顶堆。 依靠的原则是:子节点必须小于父节点。对于一个长度为n的数组来说,最后一个父节点的位置是n/2-1。

  2、将大顶堆后的数组第一个位置即a[0]取出,然后将最后一个位置即a[a.length]移动到a[0]。然后再对数组进行大顶堆,重复1、2。

每次都取出堆顶元素,也就是最大的数,最后就可以得到排序后的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排序 递归