数据结构与算法堆排序

1.对于下标为i的节点:

取左孩子:Left(i)=2i+1

取右孩子:Right(i)=2i+2

2.堆排序分类:大顶堆、小顶堆

堆:

    堆是具有一下性质的完全二叉树:每个节点的之都大于或者等于其左右好孩子节点的值,称为大顶堆;或者每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆.

   基本思路:

将无序序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆

将堆顶元素与末尾元素交换,将最大元素“沉”到数组末端

重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序

总结:

排序一个二叉树,把他变成一个大顶堆的二叉树,把二叉树变成大顶堆的数组模式,左节点left(i)=2i+1 ,右节点right(i)=2i+2 。变成大顶堆的数组之后,接着提取出大顶堆的数组,把大顶堆的数组弄混乱,重新再次进行大顶堆的构建------总的流程是:构建大顶堆---提取大顶堆最上面的一个数和大顶堆最后一个数进行交换,重复这个动作就可以实现排序。大的数都被拿到后面,实现了从小到大的排序

 

代码实现:

public static void HeapSort(int[]array)

{

if(array!=null)

{

//构建大顶堆数组

//array.Length/2-1取到二叉树的最后一个非叶节点

for(int index=array.Length/2-1;index>=0;index--)

{

Headpjust(array,index,array.Length-1);

}

for(int index=array.Lengtn-1;index>0index--)

{

Swap(array,0,index);

Heapjust(array,0,index-1);

}

}

}

//数据交换

private static void Swap(int[]array,int first,int last)

{

int temp=array[last];

array[last]=array[first];

array[first]=temp;

}

private static void Headjust(int[]array,int i,int length)

{

int root=array[i];

//取到最后一个节点的左孩子也就是左节点

int k=2*i+1;

while(k<=length)

{

if(k+1<=length&&array[k+1])

{

k=k+1;

}

if(array[k]>root)

{

array[i]=array[k];

i=k;

}

k=2*k+1;

}

//把原来根节点(Length/2-1)取到的节点的值是:root。

//在上面把值进行交换后,root的值也需要进行交换

array[i]=root;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值