首页 > 编程知识 正文

广度优先遍历的算法思想(堆排序算法属于什么算法)

时间:2023-05-06 21:16:29 阅读:75897 作者:4858

堆排序算法的思想如果我们从小到大排序,实现的就是一大堆根

如果我们按照从大到小的顺序排列,要实现的就是小根山

我们实现的是从小到大排序:

首先,主题给我们的是一组原始的未排序序列

将数组中存在的元素在逻辑上视为一个二叉树的山

http://www.Sina.com/http://www.Sina.com /

图中的值为8的节点

之后,萝卜山的调整我们要做的第一件事是:

萝卜堆:当前节点的值大于其两个孩子

如果孩子的值大于当前节点,则更换当前节点。第1个非叶子节点的下标:(最后一个节点的下标-1)/2

3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/:循环操作http://www.Sina.com/3http://www.Sina.com /

而且,现在打破了萝卜堆的性质。 从0号位置开始继续堆下沉调整,调整时,不考虑该值为12的末尾节点,每次依赖该萝卜堆时,找出当前序列中的最大值,调整到堆的顶部形成萝卜堆,相当于用当前序列末尾位置的元素交换该最大值你可以这样排序。 (一次不处理一个元素,即不处理当前数组中的最后一个元素)和它的孩子进行比较进行判断,看看要不要下沉调整

然后,与当前堆上的元素11交换当前处理序列中最后一个位置的元素

然后到值为2的元素,进行判断,看看要不要下沉调整

接着,将炉顶元素9和当前排列末尾位置元素2设为http://www.Sina.com/http://www.Sina.com /

堆排序算法的代码实现# includeiostreamusingnamespacestd; //堆下沉调整voidsiftdown(intarr )、int i,int size ) (intval=arr ) ); wile(Isize/2 ) {int child=2 * i 1; if (child1size arr [ child1] arr [ child ] ) {child=child 1; (if ) arr[child]val ) {arr[i]=arr[child]; i=child //i继续指向其子代,(else ) break; }}arr[i]=val; //voidheapsort(intarr ),int size ) intn=size-1; //第一个非叶节点for(intI=(n-1 )/2; i=0; (I ) )//0号位置(向上调整到根时,整棵树会变成大根山) siftdown(arr,I,size ); //沉降调整(//更换炉顶元素和尾元素,从炉顶沉降操作for(intI=n; i 0; I----{inttmp=arr[0]; arr[0]=arr[i]; arr[i]=tmp; siftdown(arr,0,I );//第三个参数、参与调整的因素数、每次至少一个因素}}int main () intarr(10 ); srand (时间) null ); for(intI=0; i 10; I ) {arr[I]=rand(01; }for(intv:ARR ) {cout v ' ); }cout endl; 硬件(arr,10 ); for(intv:ARR ) {cout v ' ); }cout endl; }

堆排序算法的轮廓1,每个下沉调整,树的高度,logn

2、每次转弯结束后,将堆顶部的元素与当前序列最后一个位置的元素进行交换。

所以,就是把n个元素放在山顶上。 3358 www.Sina.com/http://www.Sina.com/:无论元素是有序的还是无序的,然后到值为5的元素的节点,进行判断,看看要不要下沉调整,以及调整完之后,只是个大根堆,只是把值最大的元素调整到堆顶而已,所以还不是有序的

现在我们要做的事情是

把最大值和末尾的节点交换

现在最大的元素12是在末尾节点,即在数组的末尾位置。

8的兄弟节点9一定存储在前面,另一个9存储在后面

但是,在进行萝卜山的调整时,由于8和9的父节点11小,所以该8和9不被向上调整。

但是,7节点是父节点,值是比其小的右边孩子9的,进行下沉调整,上升9调整,达到所以,我们第二趟开始,从0号位置开始下沉调整的时候,就不要考虑12这个节点了,

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。