堆的基本操作和應用

2021-08-20 01:42:37 字數 3636 閱讀 4147

heap.h

#pragma once

typedef

int datatype;

typedef

int (*compare)(datatype pleft,datatype pright);

//表示的意思的就是接收兩個指標型別的引數,返回整型的函式指標。

typedef

struct heap

heap;

void initheap(heap* hp,compare com);//初始化堆

void createheap(heap* hp,datatype* array, int size);//建立堆

void insertheap(heap* hp,datatype data);//向堆中插入資料

void deleteheap(heap* hp);//堆的刪除

int sizeheap(heap* hp);//堆的大小

int emptyheap(heap* hp);//清空堆

void destroyheap(heap* hp);//銷毀堆

datatype topheap(heap* hp);//取堆頂元素

int greater(datatype pleft,datatype pright);//大

int less(datatype pleft,datatype pright);//

heap.c

#include"heap.h"

#include

#include

#include

void swap(datatype* pleft,datatype* pright)

void _adjustdown(heap* hp,int parent)//向下調整

}void _adjustup(heap* hp,int child)//向上調整

else

return;

}}int _checkcapacity(heap* hp)

//拷貝元素

for(;i_size;++i)

ptemp[i] = hp->_array[i];

//釋放舊空間

free(hp->_array);

hp->_array = ptemp;

hp->_capacity = newcapacity;

}return1;}

void initheap(heap* hp,compare com)//初始化堆

hp->_capacity = 3;

hp->_size = 0;

hp->_com = com;

}void createheap(heap* hp,datatype* array, int size,compare com)

hp->_capacity = size;

//2、往堆裡放置元素

for(i = 0;i < size; ++i)

hp->_array[i] = array[i];

hp->_size = size;

hp->_com = com;

//3、調整

for(; root >= 0;--root)

_adjustdown(hp,root);

}void insertheap(heap* hp,datatype data)//向堆中插入資料

void deleteheap(heap* hp)//堆的刪除

int sizeheap(heap* hp)//堆的大小

int emptyheap(heap* hp)//清空堆

void destroyheap(heap* hp)//銷毀堆

}datatype topheap(heap* hp)//取堆頂元素

int greater(datatype left,datatype right)//大

int less(datatype left,datatype right)//小

void testheap()

; heap hp;

createheap(&hp,arr,sizeof(arr)/sizeof(arr[0]),less);//這個要小堆,如果要大堆就傳greater

insertheap(&hp,5);

printf("size = %d\n",sizeheap(&hp));

printf("top = %d\n",topheap(&hp));

deleteheap(&hp);

printf("size = %d\n",sizeheap(&hp));

printf("top = %d\n",topheap(&hp));

}//堆排序(公升序)要的是大堆

void heapadjust(int* array,int size,int parent)

if(array[parent] < array[child]) //如果雙親比最大的孩子還小 不滿足情況 大的元素向上走

else

//否則滿足大堆

return;

}//堆排序(公升序)

void heapsort(int *array,int size)

}void testheapsort()

; heapsort(arr,sizeof(arr)/sizeof(arr[0]));

}

priorityqueue.h

//優先順序佇列。

#pragma once

#include

"heap.h"

typedef struct priorityqueue

priorityqueue;

void priorityqueueinit(priorityqueue* q,compare com);//初始化優先順序佇列

void priorityqueuepush(priorityqueue* q,datatype data);//向優先順序佇列插入元素

void priorityqueuepop(priorityqueue* q);

datatype priorityqueuetop(priorityqueue* q);

int priorityqueuesize(priorityqueue* q);

int priorityqueueempty(priorityqueue* q);

void priorityqueueinit(priorityqueue* q,compare com)//初始化優先順序佇列

void priorityqueuepush(priorityqueue* q,datatype data)//向優先順序佇列插入元素

void priorityqueuepop(priorityqueue* q)

datatype priorityqueuetop(priorityqueue* q)

int priorityqueuesize(priorityqueue* q)

int priorityqueueempty(priorityqueue* q)

teat.c

#include"heap.h"

int main()

資料結構 堆的基本操作和堆排序

heap.h pragma once includetypedef int heaptype define heapmaxsize 1000 typedef int compare heaptype a,heaptype b typedef struct heapheap 初始化 void heap...

python 列表基本操作和方法及其應用

1.列表的基本操作 針對列表的基本操作除了通用序列操作,還有賦值 插入 刪除 排序等 列表是可變物件型別,因此這些操作都是對原列表的修改,並不生成新的列表 1 賦值 如果是單個索引,就是單個列表元素的賦值。如果同時給多個列表元素賦值,就可以利用強大的分片功能來賦值。list是乙個常用的型別轉換函式。...

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

typedef int compare datatype left,datatype right 函式指標 typedef struct heap heap 交換函式 void swap datatype left,datatype right 向下調整 void adjustdown heap h...