博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆——数据结构
阅读量:4571 次
发布时间:2019-06-08

本文共 1790 字,大约阅读时间需要 5 分钟。

 

堆(最大堆)的操作,以下函数用A[0]来存放元素的个数:

void swap(int A[], int i, int j);  //交换两个元素

1.void sift_up(int A[], int i);   //把堆中第i个元素上移

2.void sift_down(int A[], int i);  //把堆中的第i个元素下移

3.void heap_insert(int A[], int x);  //把元素x插入堆中

4.void heap_delete(int A[], int i);    //删去堆中第i个元素

5.int delete_max(int A[]);      //删除堆中的最大元素

6.void make_heap(int A[], int n);  //使数组A中的元素按堆的结构重新组织

7.void heap_sort(int A[], int n);  //将数组A进行堆排序

 

1.元素上移操作:

沿着A[i]到根的一条线,把元素A[i]向上移动,移动过程中,把它和其父亲结点进行比较,如果大于其父亲结点,就交换两个元素。如此进行,直到找到它所到达的一个合适的位置为止。

void sift_up(int A[], int i){    while(i != 1){        if(A[i] > A[i/2]) swap(A, i, i/2);        else break;        i /= 2;    }}

2.元素下移操作:

将A[i]向下移动,移动过程中,将关键字于其两个儿子中较大的一个比较,如果小于,就交换,继续进行,否则,便是找到了合适位置,终止。

void sift_down(int A[], int i){    while((i*=2) <= A[0]){        if(i+1<=A[0] && A[i+1]>A[i]) i++; //要找最大的,最大堆嘛        if(A[i/2] < A[i]) swap(A, i/2, i);        else break;    }}

 

3.元素插入操作:

把堆的大小增1,把x放到堆的末端,然后进行上移操作。

void heap_insert(int A[], int x){    A[0]++;    A[A[0]] = x;    sift_up(A, A[0]);}

 

4.元素删除操作:

先用最后一个元素取代A[i],然后根据被删除元素和取代元素的大小,决定是上移还是下移操作。

void heap_delete(int A[], int i){    int x = A[i], y = A[A[0]];    A[0]--;    if(i<=A[0]){        A[i] = y;        if(x < y) sift_up(A, i);        else sift_down(A, i);    }}

 

5.删除最大元素

int delete_max(int A[]){    int x = A[1];    heap_delete(A, 1);    return x;}

 

6.堆的建立

数组是从0号元素开始存放元素,而堆是从数组的第1号元素开始存放数据。先将数组0号元素放到第n号中。因为叶子具有堆的性质,无须调整,所以可以从最后一个叶片的父亲开始调整,进行下移操作。

void make_heap(int A[], int n){    int i;    A[n] = A[0];    A[0] = n;    for(i=n/2; i>=1; i--) sift_down(A, i);}

 

7.堆排序:

void heap_sort(int A[], int n){    int i;    make_heap(A, n);    for(i=n; i>=1; i--){        swap(A, 1, A[0]);        A[0]--;        sift_down(A, 1);    }    A[0] = n;}

 

 

转载于:https://www.cnblogs.com/tanhehe/archive/2013/03/01/2939450.html

你可能感兴趣的文章
JAVA基础-JDBC(一)
查看>>
js中for和while运行速度比较
查看>>
算法第5章作业
查看>>
7.9 练习
查看>>
基于ArcGIS JS API的在线专题地图实现
查看>>
learnByWork
查看>>
lua 函数
查看>>
Git的基本命令
查看>>
四平方和
查看>>
第十八周 12.27-1.2
查看>>
C# IP地址字符串和数值转换
查看>>
TCHAR和CHAR类型的互转
查看>>
常用界面布局
查看>>
C语言—— for 循环
查看>>
IBM lotus9.0测试版即将公测
查看>>
xml常用方法
查看>>
Cube Stacking(并差集深度+结点个数)
查看>>
AndroidStudio3更改包名失败
查看>>
jq 删除数组中的元素
查看>>
js URL中文传参乱码
查看>>