#include <stdio.h>
#include <stdlib.h>
#include "myfunction.h"
//小根堆的结构
//堆是从0——(n-1)
//i--2i+1,2i+2
//i--(i-1)/2
//小根堆
//下移数字
//i--2i+1,2i+2
void Sift_Down_MinHeap(point *a, int i, int n)
{
if ((2 * i + 1) >= n) return; //叶子节点直接返回
int tmp = 0;
while (2 * i + 1 < n)
{
tmp = i; //父节点
i = 2 * i + 1; //i指向的是孩子节点
if (i + 1 < n && (a[i + 1].x < a[i].x || (a[i + 1].x == a[i].x && a[i + 1].y < a[i].y))) //存在右孩子
i++;
if (a[tmp].x > a[i].x || (a[tmp].x == a[i].x&&a[tmp].y > a[i].y))
{
switch_point(&a[tmp], &a[i]);
}
else
{
break;
}
}
}
//上移数字
//i--(i-1)/2
void Sift_Up_MinHeap(point *a, int i, int n)
{
if ((i - 1) / 2 < 0) return;
int tmp = 0;
while ((i - 1) / 2 >= 0)
{
tmp = (i - 1) / 2; //指向当前节点的父节点
if (a[tmp].x > a[i].x || (a[tmp].x == a[i].x&&a[tmp].y > a[i].y))
{
switch_point(&a[tmp], &a[i]);
}
else
{
break;
}
i = tmp;
}
}
//n个节点,最后一个非叶子节点是(n-1)/2
void Create_MinHeap(point *a, int n)
{
int i = 0;
for (i = (n - 1) / 2; i >= 0; i--)
{
Sift_Down_MinHeap(a, i, n);
}
}
//delete
void DeleteMax_MinHeap(point *a, int *n)
{
//point tmp = a[0];
DeleteMinHeap(a, 0, n);
}
void DeleteMinHeap(point *a, int i, int *n)
{
int num = *n;
point tmp = a[i];
point y = a[num-1];
num--;
if (i == num + 1)
{
*n = num;
return;
}
a[i] = y;
if (a[i].x < tmp.x || (a[i].x == tmp.x&&a[i].x < tmp.y))
Sift_Up_MinHeap(a, i, num);
else
Sift_Down_MinHeap(a, i, num);
*n = num;
}
//堆排序,降序输出
void MinHeap_Sort(point *a, int n)
{
Create_MinHeap(a, n);
int i = 0;
for (i = n - 1; i >= 1; i++)
{
switch_point(&a[0], &a[i]);
Sift_Down_MinHeap(a, 0, i);
}
}
int select(point *a, int m, int b, int c)
{
int tmp = -1;
if (m != -1) //m = 1
{
tmp = m;
if (b != -1) //m = 1 b = 1
{
tmp = (a[m].y >a[b].y)? m: b;
if (c != -1)
{
tmp = (a[tmp].y > a[c].y)? tmp: c;
}
}
else
{
if (c != -1)
{
tmp = (a[tmp].y > a[c].y) ? tmp : c;
}
}
}
else
{
if (b != -1) //m = -1 b = 1
{
tmp = b;
if (c != -1)
{
tmp = (a[tmp].y > a[c].y) ? tmp : c;
}
}
else //m = -1 b = -1
{
tmp = c;
}
}
return tmp;
}
//堆查找
int Find_MinHeap(point *a, point src, int i, int n)
{
if (i >= n)
{
return -1;
}
int p0 =-1, p1 = -1, p2 = -1;
if (a[i].x <= src.x) //X匹配成功
{
if (a[i].y <= src.y) //Y匹配成功
{
p0 = i;
}
p1 = Find_MinHeap(a, src, 2 * i + 1, n);
p2 = Find_MinHeap(a, src, 2 * i + 2, n);
p0 = select(a, p0, p1, p2);
return p0;
}
else
{
return -1;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
黑白点匹配问题代码
共32个文件
tlog:6个
obj:6个
c:5个
需积分: 43 34 下载量 29 浏览量
2017-05-24
21:02:20
上传
评论
收藏 547KB RAR 举报
温馨提示
自己用C写了一下黑白点匹配问题,还算比较详细吧。 注意:有两个main函数(main,main01),分别是两种思路写的。
资源推荐
资源详情
资源评论
收起资源包目录
黑白点匹配问题.rar (32个子文件)
黑白点匹配问题
.vs
黑白点匹配问题
v14
.suo 44KB
黑白点匹配问题.VC.db 1.66MB
黑白点匹配问题
黑白点匹配问题.vcxproj.filters 1KB
MinHeap.c 3KB
black_white_match02.c 2KB
MaxHeap.c 2KB
mysort.c 868B
Debug
MaxHeap.obj 8KB
Heap.obj 8KB
vc140.pdb 76KB
black_white_Match.obj 13KB
black_white_match02.obj 19KB
vc140.idb 67KB
black_white_match.obj.enc 17KB
MinHeap.obj 11KB
mysort.obj 6KB
黑白点匹配问题.tlog
CL.write.1.tlog 7KB
CL.read.1.tlog 14KB
CL.command.1.tlog 4KB
黑白点匹配问题.lastbuildstate 240B
link.write.1.tlog 1KB
link.command.1.tlog 3KB
link.read.1.tlog 4KB
black_white_match02.obj.enc 20KB
黑白点匹配问题.log 371B
黑白点匹配问题.vcxproj 7KB
myfunction.h 1KB
black_white_Match.c 1KB
黑白点匹配问题.sln 1KB
Debug
黑白点匹配问题.ilk 371KB
黑白点匹配问题.exe 50KB
黑白点匹配问题.pdb 684KB
共 32 条
- 1
资源评论
qq_36247988
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功