#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...