typedef int (*compare)(datatype left,datatype right);//函式指標
typedef struct heap
heap;
//交換函式
void swap(datatype *left,datatype *right);
//向下調整
void adjustdown(heap* hp,int parent);
//向上調整
void adjustup(heap* hp,int child);
//建立堆
void create(heap* hp,datatype* array,int size,compare com);
//初始化堆
void heapinit(heap* hp,compare com);
//堆中插入元素
void heapinsert(heap* hp,datatype data);
//判空
int heapempty(heap* hp);
//銷毀堆
void destoryheap(heap* hp);
//擴容
void checkcapacity(heap* hp);
//堆的元素個數
int heapsize(heap* hp);
//獲取堆頂元素
datatype heaptop(heap* hp);
//小堆規則
int less(datatype left,datatype right);
//大堆規則
int greater(datatype left,datatype right);
//堆排序
void heapsort(int* array,int size);
void adjustheap(int* array,int size,int parent);
void swapsort(int* left,int* right);
void heapsortprint(int* array,int size);
heap.c
#include "heap.h"
//交換函式
void swap(datatype *left,datatype *right)
//向下調整
void adjustdown(heap* hp,int parent)
else
return; }}
//向上調整
void adjustup(heap* hp,int child)
else
return;
}//建立堆
void create(heap* hp,datatype* array,int size,compare com)
hp->_size = size;
hp->_com = com;
//3.調整,找葉子節點
root = (size-2) >> 1;
for( ; root>=0;root--)
adjustdown(hp,root);
}//初始化堆
void heapinit(heap* hp,compare com)
hp->_capacity = 3;
hp->_size = 0;
hp->_com = com;
}//堆中插入元素(進行向上調整)
void heapinsert(heap* hp,datatype data)
//判空
int heapempty(heap* hp)
//刪除堆,每次刪除刪除堆頂元素
void destoryheap(heap* hp)
//擴容
void checkcapacity(heap* hp)
free(hp->_array);
hp->_array = newarray;
hp->_capacity = pnewcapacity; }}
//堆的元素個數
int heapsize(heap* hp)
//獲取堆頂元素
datatype heaptop(heap* hp)
//小堆規則
int less(datatype left,datatype right)
//大堆規則
int greater(datatype left,datatype right)
//堆排序(此處選擇降序排序,用小堆)
void heapsort(int* array,int size)
while(end > 0) }
void adjustheap(int* array,int size,int parent)
else
return; }}
void swapsort(int* left,int* right)
void heapsortprint(int* array,int size)
; heapinit(&hp,less);
create(&hp,arr,sizeof(arr)/sizeof(arr[0]),less);
printf("top is:%d\n",heaptop(&hp));
printf("size is:%d\n",heapsize(&hp));
destoryheap(&hp);
printf("top is:%d\n",heaptop(&hp));
printf("size is:%d\n",heapsize(&hp));
printf("heap is empty:%d\n",heapempty(&hp));
return 0;
}#endif
int main()
; int size = sizeof(arr)/sizeof(arr[0]);
heapsortprint(arr,size);
heapsort(arr,size);
heapsortprint(arr,size);
return 0;
}
資料結構 堆的基本操作和堆排序
heap.h pragma once includetypedef int heaptype define heapmaxsize 1000 typedef int compare heaptype a,heaptype b typedef struct heapheap 初始化 void heap...
資料結構C語言版堆排序
堆排序的由來還得說到簡單選擇排序,由簡單選擇排序中的在進行剩餘的n 2個資料比較時若能利用前n 1次比較的所得資訊,則可以減少以後各趟排序的比較次數,由此聯想出錦標賽排序也就是樹形排序,但是樹形排序的輔助儲存空間較多,和 最大值 進行比較多餘的比較等缺點,因此,在1964年威洛姆斯提出了堆排序,堆排...
堆的操作和堆排序 最小堆實現遞減排序 C
include include includeusing namespace std 參考 void heapfixdown int a,int i,int n 從第i個位置開始調整堆,從上向下 a i temp void heapdeletenumber int a,int n 在最小堆中刪除數,...