【算法导论】6.1~6.5

堆排序

时间复杂度: Θ ( n l g n ) Θ(nlgn) Θ(nlgn)
代码:

#define _CRT_SECURE_NO_WARNINGS  
#include<stdio.h>
/*向下调整以维持最大堆的性质*/
void siftdown(int a[], int x, int n)
{
	int l, r, max, t;
	while (x <= n / 2)
	{
		l = x * 2;
		r = x * 2 + 1;
		if (l <= n&&a[x] < a[l])
		max = l;
		else
		max = x;
		if (r <= n&&a[max] < a[r])
		max = r;
		if (max != x)
		{
			t = a[max];
			a[max] = a[x];
			a[x] = t;
			x = max;
		}
		else
			break;
	}
	return;
}
void heapsort(int a[], int x)
{
	int t;
	t = a[1];
	a[1] = a[x];
	a[x] = t;
	siftdown(a, 1, x-1);
	return;
}
void main()
{
	int a[3200], i, n;
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	/*建堆*/
	for (i = n / 2; i > 0; i--)
		siftdown(a, i, n);
	/*排序*/
	for (i = n; i > 0; i--)
		heapsort(a, i);
	/*输出*/
	for (i = 1; i <= n; i++)
	{
		if (i % 40 == 0) printf("\n");
		printf("%d ", a[i]);
	}
	getchar();
	getchar();
}

优先队列

代码:

#define _CRT_SECURE_NO_WARNINGS  
#define MAXN 3200;
#include<stdio.h>
#include<stdlib.h>
/*向下调整以维持最小堆的性质*/
typedef struct
{
	int maxsize;
	int size;
	int *a;
} min_heap;
typedef min_heap* MinHeap;
void SiftDown(int a[], int x, int n)
{
	int l, r, max, t;
	while (x <= n / 2)
	{
		l = x * 2;
		r = x * 2 + 1;
		if (l <= n&&a[x] > a[l])
			max = l;
		else
			max = x;
		if (r <= n&&a[max] > a[r])
			max = r;
		if (max != x)
		{
			t = a[max];
			a[max] = a[x];
			a[x] = t;
			x = max;
		}
		else
			break;
	}
	return;
}
void SiftUp(int a[], int i, int x)
{
	int t;
	if (x > a[i])
	{
		printf("x is too big!\n");
		return;
	}
	a[i] = x;
	while (i > 1 && a[i / 2] > a[i])
	{
		t = a[i];
		a[i] = a[i / 2];
		a[i / 2] = t;
		i = i / 2;
	}
	return;
}
MinHeap CreatHeap(int Maxsize)
{
	MinHeap s;
	s = (MinHeap)malloc(sizeof(min_heap));
	s->maxsize = Maxsize;
	s->size = 0;
	s->a = (int*)malloc(sizeof(int)*Maxsize);
	return s;
}
void Insert(MinHeap s, int x)
{
	if (s->size == 0)
	{
		s->size++;
		s->a[1] = x;
	}
	else
	{
		s->size++;
		s->a[s->size] = MAXN;
		SiftUp(s->a, s->size, x);
	}
	return;
}
int Min(MinHeap s)
{
	if (s->size == 0)
	{
		printf("heap is empty!");
		return -1;
	}
	else
		return s->a[1];
}
int Pop(MinHeap s)
{
	if (s->size == 0)
		{
			printf("heap is empty!");
			return -1;
		}
	int ans = s->a[1];
	s->a[1] = s->a[s->size];
	s->size--;
	SiftDown(s->a, 1, s->size);
	return ans;
}
void Delete(MinHeap s, int x)
{
	s->a[x] = MAXN;
	SiftDown(s->a, x, s->size);
	s->size--;
	return;
}
void main()
{
	MinHeap s;
	s = CreatHeap(30000);
	Insert(s, 5);
	Insert(s, 3);
	Insert(s, 62);
	Insert(s, 44);
	printf("%d\n", Min(s));
	printf("%d\n", Pop(s));
	printf("%d\n", Min(s));
	Insert(s, 1);
	printf("%d\n", Min(s));
	getchar();
	getchar();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。各章自成体系,可以作为独立的学习单元。算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂。说明和解释力求浅显易懂,不失深度和数学严谨性。   本书自第1版出版以来,已经成为世界范围内广泛使用的大学教材和专业人员的标准参考书。第2版增加了论述算法作用、概率分析与随机算法、线性规划等几章。同时,对第1版的几乎每一节都作了大量的修订。一项巧妙而又重要的修改是提前引入循环不变式,并在全书中用来证明算法的正确性。在不改变数学和分析重点的前提下,作者将许多数学基础知识从第一部分移到了附录中,并在开始部分加入了一些富有诱导性的题材。   ★经典的算法书,被卓越网,《程序员》等评选为2006年最受读者喜爱的十大IT图书之一。   ★算法领域的标准教材,全球多所知名大学选用    ★MIT名师联手铸就,被誉为“计算机算法的圣经”    ★编写上采用了“五个一”,即一章介绍一个算法、一种设计技术、一个应用领域和一个相关话题。    以相当的深度介绍了许多常用的数据结构和有效的算法,使得这些算法的设计和分析易于被各个层次的读者所理解。教学网址、视频课程及在线学习中心,全方位学习模式,内容很丰富。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值