您的位置:首页 > 理论基础 > 数据结构算法

数据结构之排序(五)堆排序

2015-10-26 13:52 351 查看
<span style="font-size:18px;">package com.xaut.zyq;

import java.util.Arrays;

//堆排序就是简单选择排序的一种改进,这种改进的效果是非常明显的。
/*
* 堆是具有下列性质的完全二叉树,每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;
* 或者 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。
* 堆排序的基本思想就是将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根结点。
* 将它移走(其实就是将其与将其与堆数组的末尾元素交换,此时末尾元素)
*/
public class HeapSort {
public static void main(String[] args) {
int a[]={0,50,10,90,30,70,40,80,60,20};
HeapSort hs=new HeapSort();
System.out.println(Arrays.toString(hs.HeapSort(a)));
}
private int[] HeapSort(int b[]){
int i;
for ( i = b.length/2; i>0; i--) {//将数组b构建成一个大顶堆
HeapAdjust(b,i,b.length-1);
}
for ( i = b.length-1; i>1; i--) {
swap(b,1,i);//将顶堆记录和当前未经排序子序列的最后一个记录交换
HeapAdjust(b, 1, i-1);//将剩下的重新进行调整为大顶堆
}
return b;
}
//函数被第一次调用时,s=b.length/2; m=b.length;
private void HeapAdjust(int c[],int s,int m){
int temp,j;
temp=c[s];
for(j=2*s;j<=m;j*=2){
if(j<m && c[j]<c[j+1])
++j;
if(temp>=c[j])
break;
c[s]=c[j];
s=j;
}
c[s]=temp;
}
private void swap(int c[], int m, int n) {
int temp = c[m];
c[m] = c
;
c
= temp;
}
}
/*
* 性质5:第一条就说一颗完全二叉树,如果i=1,则结点i是二叉树的根,无双亲;
* 如果i>1,则其双亲是结点[i/2]。
* 那么对于有n个结点的二叉树而言,它的i值自然就是小于等于[n/2]了。
* 步骤:
* 先建立大顶堆,然后再交换调整
* 再次递归建立新的大顶堆,将最大堆的根节点和最小的位置交换,这样就排序是先选出最大的,接着依次进行。
*/</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: