日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言实现常用数据结构——堆

發(fā)布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。