24小(xiǎo)时联系電(diàn)话:18217114652、13661815404

中文(wén)

您当前的位置:
首页>
電(diàn)子资讯>
技术专题>
二进制堆排序算法说明

技术专题

二进制堆排序算法说明


二进制堆排序算法说明

二进制堆排序算法使用(yòng)二进制树执行排序操作。二叉树是由数组中的元素构建而成的结构,如下图所示以树的形式显示。二进制堆树有(yǒu)两种类型,max-heapmin-heap

同样值得注意的是,还有(yǒu)其他(tā)排序算法,例如Bubble排序,Selection排序,Insertion排序和Merge排序来对给定数组中的元素进行排序。

当涉及二进制堆排序算法时,它有(yǒu)两种类型。

最大堆二叉树,其父节点大于或等于其每个子节点。上面显示的堆树是最大堆树的示例。

最小(xiǎo)堆二叉树,其中所有(yǒu)父节点均小(xiǎo)于或等于其每个子节点。

堆排序通过删除节点中最大或最小(xiǎo)的元素并将其放入数组中来执行排序。每次提取之后,将更新(xīn)堆以维护堆属性。為(wèi)了更好地解释这一点,请看以下示例

二进制堆排序算法说明:

考虑以下具有(yǒu)五个数字的数组。我们需要使用(yòng)Max-heap以升序对它进行排序。

让我们根据给定的数字数组构造一个完整的二叉树。通过以这种方式排列数组中的元素来构造树,使其形成具有(yǒu)父节点和子节点的树状数据结构。

该树必须是完整的二叉树才能(néng)成為(wèi)堆数据结构。有(yǒu)两种类型的节点,父节点和子节点。子节点是附加到单个节点(即其父节点)的节点。在下面的二叉树中,15是父节点,743是其子节点。同样,在下一级的二叉树7中,父节点– 255是子节点。

我们需要将父节点与子节点(7255)进行比较。

其中最大的25个。

7会被25交换,因為(wèi)它大于7

将节点2543与它的父节点43进行比较。

15在父节点中将被替换為(wèi)43,因為(wèi)相比而言,它在其他(tā)两个节点中最大。

因此,我们得到了我们的最大堆

现在我们需要构造排序后的数组。為(wèi)此,涉及三个步骤。

交换

去掉

堆肥

首先将根节点与最后一个节点交换。因為(wèi)我们知道这是最大堆,所以根节点在所有(yǒu)节点中最大,而5在最小(xiǎo)节点中。

删除数字43

通过将最大值放在根节点或堆中来重建堆

用(yòng)7交换25

移除25

通过将15放在顶部来进行堆肥

7交换15

移除15

用(yòng)5交换7

删除7

然后我们得到排序的数组

然后我们得到排序的数组

实现二进制堆排序算法的步骤:

从输入元素创建二叉树

您需要根据需要执行的排序类型将其设置為(wèi)最大堆或最小(xiǎo)堆。

比较父节点和子节点

用(yòng)最大的子节点替换父节点

对所有(yǒu)父节点执行相同的操作

重复直到对二叉树中的所有(yǒu)节点进行排序并获得最大堆

然后将根节点与最后一个节点交换

删除该节点,因為(wèi)这是最大值,并根据排序顺序将其放入数组的最右侧或数组的最左侧

通过将最大值放到根节点或heapify来重建堆

将根节点与最右边的子节点进行比较

重复相同的过程,直到所有(yǒu)节点都被整理(lǐ)到阵列中

二进制堆排序算法的示例代码:

#include <stdio.h>

 //交换两个元素位置的函数

 void swapint * aint * b{

   int temp = * a;

   * a = * b;

   * b =温度;

 }

 void heapifyint arr []int nint i{

   //在根,左子和右子中找到最大的

   int最大= i;

   左整数= 2 * i + 1;

   正确的整数= 2 * i + 2;

   如果(左<n && arr [left]> arr [largest]

     最大=左;

   如果(正确<n && arr [正确]> arr [最大]

     最大=正确;

   //如果根不是最大,交换并继续堆

   如果(最大!= i{

     swap(&arr [i],&arr [large];

     heapifyarrn,最大);

   }

 }

 //主函数做堆排序

 void heapSortint arr []int n{

   //建立最大堆

   对于(int i = n / 2-1; i> = 0; i--

     heapifyarrni;

   //堆排序

   对于(int i = n-1; i> = 0; i--{

     swap(&arr [0],&arr [i];

     //重整根元素以再次在根上获得最高元素

     heapifyarri0;

   }

 }

 //打印数组

 void printArrayint arr []int n{

   对于(int i = 0; i <n; ++ i

     printfd”arr [i];

   printf“ \ n”;

 }

 //主要代码

 int main(){

   int arr [] = {15743255};

   int n = sizeofarr/ sizeofarr [0];

   heapSortarrn;

   printf排序数组為(wèi)\ n”;

   printArrayarrn;

 }

请输入搜索关键字

确定