您的位置:首页 > 其它

排序——堆排序

2016-05-16 15:24 267 查看
优先队列可以用于0(N*logN)时间的排序。

若使数组按从小到大顺序排序,则需构建最大堆Max。

堆排序步骤:

1.若使数组按从小到大顺序排序,则需构建最大堆Max;

2.使用需要排序的数组以线性时间建立一个堆;

3.然后通过每次将堆中的最后元素与第一个元素交换,执行N-1次deleteMax操作,每次将堆的大小缩减1并进行下滤。

//swap函数;
public void swap(int[] data,int i,int j)
{
int temp=data[i];
data[i]=data[j];
data[j]=temp;
}
//对非叶子节点的所有结点进行下滤;    *对堆insert时才使用上滤操作*
public void percolateDown(int[] data,int i,int n)
{
int temp=data[i];
int child;
for(; 2*i+1<n; i=child)
{
child=2*i+1;//leftchild;
if(child<n-1&&data[child]<data[child+1])
child++;//rightchild;
 if(data[child]>temp)
data[i]=data[child];
else
break;
}
data[i]=temp;
}
public void heapSort(int[] data)
{
//建max堆;
for(int i=data.length/2;i>=0;i--)
{
percolateDown(data,i,data.length);
}
for(int i=data.length-1;i>0;i--)
{
swap(data,0,i);//i为当前堆中最后的元素;
percolateDown(data,0,i);//i也为将堆缩减1后堆的大小;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: