堆的基本操作和堆排序 C語言版

2021-08-19 22:28:05 字數 3275 閱讀 4761

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 在最小堆中刪除數,...