C语言实现常用数据结构——堆
生活随笔
收集整理的這篇文章主要介紹了
C语言实现常用数据结构——堆
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
#include<stdio.h>
#include<stdlib.h>
#define CAPACITY 20/*堆有兩個性質(zhì):* 1.結(jié)構(gòu)性:堆必須是一顆完全二叉樹* 2.堆序性:堆的父節(jié)點要么都大于子節(jié)點,要么小于子節(jié)點,前者叫大頂堆,后者叫小頂堆;* 由此,堆可以用一個數(shù)組來表示,并有如下性質(zhì):* 1.對于任意i位置的元素,他的左子節(jié)點在2i位置,右子節(jié)點在2i+1位置;* 2.他的父節(jié)點(假如有)在i/2位置*//*創(chuàng)建一個小頂堆,size代表的是實際元素的個數(shù)*/
typedef struct MinHeap {int size;int data[CAPACITY];
} heap;void init( heap *h );
void insert(heap *h,int x);
void travel(heap *h);/*數(shù)組0位置要空著*/
void init( heap *h ) {h->size=0;
}void insert(heap *h,int x) {if(h->size == CAPACITY) {printf("heap is full!");return;}int i;h->size++;for(i=h->size; i>=1; i/=2) {if(x < h->data[i/2]) {h->data[i]=h->data[i/2];} else {break;}}h->data[i]=x;
}
/*刪除最小元素,在小頂堆即意味著刪除根節(jié)點* 1.首先將根元素保存,等待最后return;* 2.將最后一個元素賦值給根元素,并將這個值賦給緩沖區(qū),這樣保證了堆的結(jié)構(gòu)性;* 3.從根節(jié)點開始遍歷,比較父節(jié)點和兩個子節(jié)點的大小,如果緩沖區(qū)值大于較小的子節(jié)點,則將小節(jié)點的值賦給父節(jié)點* 4.直到緩沖區(qū)值小于游標(biāo)的兩個子節(jié)點,此時將緩沖區(qū)值賦給游標(biāo)所在位置*/
int deleteMin(heap *h) {int child;int result=h->data[1];h->data[1]=h->data[h->size];h->size--;int i=1;int temp=h->data[1];for(i=1; 2*i <= h->size; i=child) {child=2*i;if(child !=h->size && h->data[child] > h->data[child+1] ) {/*如果左子節(jié)點非最后元素且>右子節(jié)點,則右子節(jié)點最小*/child++;}if(temp > h->data[child]) {/*如果temp大于當(dāng)前元素的最小子節(jié)點,則將最小子節(jié)點賦值給父節(jié)點,否則跳出*/h->data[i]=h->data[child];} else {break;}}h->data[i]=temp;/*將緩沖區(qū)值賦給當(dāng)前游標(biāo)*/return result;
}/*遍歷堆數(shù)組:越過空白位置0,從1開始*/
void travel(heap *h) {int i;for(i=1; i<=h->size; i++) {printf("%d ",h->data[i]);}printf("\n");
}/*堆排序*/
void heap_sort(int a[],int n) {int i;heap *h=(heap*)malloc(sizeof(heap));/*給堆指針分配空間*/init(h);/*初始化堆*/for(i=0; i<n; i++) {/*將數(shù)組的元素依次插入堆*/insert(h,a[i]);}for(i=0; i<n; i++) {a[i]=deleteMin(h);}
}
/*遍歷數(shù)組*/
void travel_array(int a[],int n) {int i;for(i=0; i<n; i++) {printf("%d ",a[i]);}printf("\n");
}main() {int a[]= {67,8,4,34,86,87,6,45,7,864,56,1,3,78,9,13};int n=sizeof(a)/sizeof(int);travel_array(a,n);heap_sort(a,n);travel_array(a,n);
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/wangbin2188/p/9603437.html
總結(jié)
以上是生活随笔為你收集整理的C语言实现常用数据结构——堆的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Net.Core导入EXCel文件里的数
- 下一篇: 素数计算之埃氏筛法、欧拉筛法