二叉堆

原创 2015年07月09日 22:25:05
#include<stdio.h>
#include<stdlib.h>

int lowbit(int x)
{
	int z;
	z = ~x;
	z++;
	return (x & z);
}
//测试
/*int main(void)
{
	int n,t;
	n = 50;
	while(n)
	{
		t = lowbit(n);
		printf("%d\n",t);
		n -= t;
	}	
	return 0;
}*/
/*求和*/
int Sum(unsigned int *C,unsigned n)
{
	int sum  = 0;
	while(n > 0)
	{
		sum += C[n];
		//printf("%d ",sum);
		n -= lowbit(n);
	}
	return sum;
}
/*修改某位置的值*/
void Change(unsigned* c,int n,int a)
{
	int m;
	printf("当前位置现在为%d,亲输入你要赋予它的新值\n",a);
	scanf("%d",&m);
	m = -a+m;
	while(n <= 1000)
	{
		c[n] += m;
		n += lowbit(n);
	}
}
int main(void)
{
	unsigned int A[1000],c[1000];
	unsigned i,j,k,n,s,m;
	unsigned int N;
	scanf("%u",&N);
	///scanf("%u",A[1]);
	for(i = 1;i <= N;i ++)
	{
		k = 1;
		//m = i;
		scanf("%u",&A[i]);
		c[i] = A[i];
		if(j = lowbit(i))
		{
			while(k < j)
			{
				c[i] += A[i - k];
				k ++;
			}
		}
	}
	for(i = 1;i <= N;i ++)
		printf("%d ",c[i]);
	printf("请输入你想求前多少个数的和\n");
    scanf("%d",&n);
	s = Sum(c,n);
	printf("%d\n",s);
	printf("请输入你想修改的数的位置:\n");
	scanf("%d",&n);
	Change(c,n,A[n]);
	for(i = 1;i <= N;i ++)
		printf("%d ",c[i]);
	printf("请输入你想求前多少个数的和\n");
	printf("请输入你想求前多少个数的和\n");
    scanf("%d",&n);
	s = Sum(c,n);
	printf("%d\n",s);
	return 0;
}

二叉堆(binary heap)

  • 2017年10月06日 22:46
  • 294KB
  • 下载

二叉堆:最大堆

  • 2014年07月08日 17:15
  • 5KB
  • 下载

图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)

【0】README0.1)为什么有这篇文章?因为 Dijkstra算法的优先队列实现 涉及到了一种新的数据结构,即优先队列(二叉堆)的操作需要更改以适应这种新的数据结构,我们暂且吧它定义为Distan...

二叉堆代码

  • 2015年10月02日 16:56
  • 1KB
  • 下载

二叉堆 最小堆 Python 实现

  • 2014年03月01日 19:58
  • 3KB
  • 下载

数据结构基础 之 二叉堆 概念篇

本文从二叉堆的定义、基本操作、源码思想、时空复杂度和注意要点5个方面介绍二叉堆。 【二叉堆定义】 二叉堆是完全二叉树和近似二叉树,二叉堆满足堆特性:父节点的键值总是与任何一个子节点的键值保持固定的序关...

二叉堆最小堆的Java实现

  • 2014年03月01日 20:01
  • 3KB
  • 下载

数据结构-BST、AVL、二叉堆、B树、B+树、红黑树

总结了数据结构中树的一些常见的类型。一、线索二叉树对于n个结点的二叉树,在二叉链存储结构中有n+1个空链域,利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针,这些指针称为线索,加上线...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉堆
举报原因:
原因补充:

(最多只允许输入30个字)