HeapSort 堆排序實現(演算法類)

2021-05-27 01:38:37 字數 2060 閱讀 3215

#ifndef _heap_sort_h_

#define _heap_sort_h_

#define inc_heap_size 10

typedef int* heap_data;

typedef struct _heapelem heapelem;

typedef struct _heap heap;

#define heap_elem_size sizeof(heapelem)

#define elem(heap, i) ((heapelem *) (heap->pelem + heap_elem_size * i))

#define elem_key(heap, i) (((heapelem *) (heap->pelem + heap_elem_size * i))->key)

#define parent(i) ((i+1)/2-1)

#define left(i)  (2*(i+1)-1)

#define right(i) (2*(i+1))

#define exchange(heap, i, j)  

void init_heap(heap* heap);

void insert_heap(heap* heap, const heapelem* elem);

void max_heap(heap* heap, int i);

void destroy_heap(heap* heap);

void print_heap(const heap* heap);

heapelem* create_elem(heap_data data, long key);

void build_max_heap(heap* heap);

void heap_sort(heap* heap);

void create_elem1(heapelem** elem, heap_data data, long key);

#endif

#include

#include

#include

#include "heapsort.h"

void init_heap(heap* heap)

void insert_heap(heap* heap, const heapelem* elem)

else

}memcpy(heap->pelem + heap->length * heap_elem_size, elem, heap_elem_size);

heap->length++;

heap->heap_size++;

}void destroy_heap(heap* heap)

}void print_heap(const heap* heap)

printf("\n\n");

}void max_heap(heap* heap, int i)

if(right(i) < heap->heap_size

&&  elem_key(heap,right(i)) >= elem_key(heap, largest))

if(i!=largest)

}heapelem* create_elem(heap_data data, long key)

elem->data = data;

elem->key = key;

return elem;

}void create_elem1(heapelem** elem, heap_data data, long key)

(*elem)->data = data;

(*elem)->key = key;

}void build_max_heap(heap* heap)

}void heap_sort(heap* heap)

}

#include

#include

#include "heapsort.h"

int main(char args)

堆排序 Heap Sort 演算法的實現

堆排序演算法思想非常簡單,先把乙個陣列看成乙個heap,在下面的實現中,我使用的是max heap,也就是說根總是比葉子大。所以我們第一步就是建立max heap。建立完畢以後,很明顯這個heap的root就是最大的,把最大的根放在陣列的最後乙個位置,把陣列長度縮小乙個位置,這樣最大的那個數就不會再...

堆排序 heap sort 演算法講解與實現

開始時,堆不可能是這個樣子,因為,將陣列轉化為樹,是有規則的,必須把左邊填滿才能再填右邊。待排序陣列 a 46,30,82,90,56,17,95 組成乙個二叉樹,將46,30,82,90,56,17,95這幾個數字從儲存在陣列結構,轉變到二叉樹及結構,是通過為一些陣列下標賦予一些新的關係。比如,在...

堆排序 Heap Sort 演算法(C C)

堆排序演算法基於選擇排序的思想,利用堆結構和二叉樹的一些性質來完成資料的排序。對堆中的結點按層進行編號,將其對映到陣列中會有以下特點 小頂堆 每個結點的值都小於或等於其左右子結點的值。a i a 2 i 1 a i a 2 i 2 大頂堆 每個結點的值都大於或等於其左右子結點的值。a i a 2 i...