堆排序的實現

2021-09-23 14:29:54 字數 2044 閱讀 8676

前面在執行希爾排序,插入排序的時候,我是以下標為0開始儲存順序表結點,但是在堆排序的時候發現這樣的結構對於堆排序這樣頻繁使用下標的演算法來說比較麻煩,於是我將原來的**修改了一下,使其下標從1開始

下面是具體函式實現

#include#include#include#includeusing namespace std;

#define max_size 20

/****中多次出現assert()函式 於是查了一下assert函式的用法

*assert的作用是先計算表示式 expression ,如果其值為假(即為0),那麼它先向stderr列印一條出錯資訊,然後通過呼叫 abort 來終止程式執行。

*/typedef struct seqlist;

//順序表初始化

void init_list(seqlist *l);

//尾插

void last_insert(seqlist *l, int n);

//讀取陣列中第n個元素的值

void read(seqlist *l, int n);

//把第i個數改為m

void change(seqlist *l, int i, int m);

//列印順序表

void print(seqlist *l);

//找到數為n在陣列中的下標位置

void find(seqlist *l, int n);

//在第i個位置上插入數字n

int insert(seqlist *l, int i, int n);

//交換陣列中下標為i和j的值

void swap(seqlist *l,int i,int j);

void heapadjust(seqlist *l,int s,int m);

void heapsort(seqlist *l);

#include"seqlist.h"

#includeusing namespace std;

#define max_size 20

//順序表初始化

void init_list(seqlist *l)

//尾插

void last_insert(seqlist *l, int n)

else

}//讀取陣列中第n個元素的值

void read(seqlist *l, int n)

//把第i個數改為m

void change(seqlist *l, int i, int m)

//列印順序表

void print(seqlist *l)

//找到數為n在陣列中的下標位置

void find(seqlist *l, int n)

}//在第i個位置上插入數字n

int insert(seqlist *l, int i, int n)

if (l->size == max_size)

l->size++;//總個數再加一

for (int j = l->size; j > i; j--)

//把下標位置為i-1的位置空出來 再賦值

l->a[i] = n;

return 0; //return 1和return 0?

}//交換陣列中下標為i和j的值

void swap(seqlist *l,int i,int j)

void heapadjust(seqlist *l,int s,int m)

l->a[s]=temp;//插入值

}void heapsort(seqlist *l)

for(i=l->size;i>1;i--)

}

#include"seqlist.h"

int main()

下面是**實現的結果

50 10 90 30 70 40 80 60 20 

10 20 30 40 50 60 70 80 90

堆排序的實現

堆排序是利用了一種資料結構叫做二叉堆,二叉堆是這樣定義的 二叉堆是一種特殊的堆,二叉堆是完全二元樹或者是近似完全二元樹,有最小堆和最大堆 特點 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 利用堆排序資料的儲存方式如...

堆排序的實現

file binaryheap.hpp brief 二叉堆 author xiao2 joyjj0218 qq.com version 1.0 date 2015.11.17 ifndef binaryheap hpp define binaryheap hpp include include us...

堆排序的實現

要想用堆來實現排序,首先得構建乙個堆。將字串 sortexample 放入起始下標為1的陣列中,構成一顆二叉樹 構造堆時,從最後乙個非葉子節點出發。如上圖所示,最後乙個非葉子節點下標為n 2 5,可以觀察出任意乙個大小為n的二叉堆的最後乙個非葉子節點的標號都是n 2。從5開始一直到根節點1,一直進行...