堆排序之小根堆

2021-08-21 19:22:15 字數 1622 閱讀 9636

一、堆

1.概念:它是一種完全二叉樹(即前n-1層是滿的,最後一層連續缺失右邊的結點)

2.堆的目的:排序

3.堆的建立:建立一棵完全二叉樹

4.儲存方式:鏈式儲存,按層儲存

5.演算法:建立結構體,宣告結點型別

typedef struct node

6.先建立根結點,後建立其他結點;

採用佇列儲存資料元素,動態建立乙個佇列:q

初始化:root為根結點,左右都賦空,讓pa指向根結點

遍歷資料集合,建立新結點 p,看pa的左右域,先掛左子女,後掛右子女;用p實現掛結點

建立完,釋放佇列

btnode* creatdui(int a,int n) 

q[++rear]=p;

}

二、小根堆

即:根節點小於左右結點

1. 再次借助於佇列,佇列存的是結點指標,front和rear兩個佇列指標,初始front=0;rear=0;

首先使建立好的完全二叉樹的所有結點的入佇列,結果是:front在第乙個葉子上,rear在最後乙個結點元素上

將end放在佇列的尾部,即排序後最小的元素上,使隊尾標誌不丟失:end=rear;

然後調整堆:比較雙親和子女的大小

#include#include#define n  20

typedef struct nodebtnode;

//建立完全二叉樹

btnode* creatdui(int a,int n)

q[++rear]=p;

} return root;

free(q);

} //堆排序

void duisort(btnode *root)

if(p->right)

if(!p->left&&!p->right) //當父節點無左右子女時,二叉樹存入佇列結束,跳出迴圈

break;

} //結果:front指第乙個葉子,rear在最後乙個元素/葉子上

end=rear;

//調整堆

while(front>1)

}if(tag)

break;

} //交換

m=root->data;

root->data=q[rear]->data;

q[rear]->data=m;

rear--;

//去葉子

if(q[front-1]->right)

q[front-1]->right=null;

else

}//輸出

for( ;end>0;end--)

printf("%d ",q[end]->data);

} int main(void);

btnode* root;

root=creatdui(a,12);

printf("\n輸出最小根堆\n");

duisort(root);

}

堆排序(大根堆 小根堆)

堆 堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質 key i key 2i 1 key i key 2i 2 或者key i key 2i 1 key key 2i 2 即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字。堆分為大頂堆和小頂堆,滿足key i key 2i 1 ke...

小根堆排序

2017 07 24 17 04 23 writer pprp 小根堆排序,使用陣列模擬堆,時間複雜度為o nlogn 調整部分的程式比較難理解,有的地方還是不太清楚。如下 include using namespace std const int n 100000 int a n 1 void a...

堆排序(大根堆)

堆排序是利用堆的性質進行的一種選擇排序。下面先討論一下堆。1.堆堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質 key i key 2i 1 key i key 2i 2 或者key i key 2i 1 key key 2i 2 即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字。...