加权法排序二值序列所记录的对象集

问题

给定一串 6 位 0-1 序列, 如 '111111',该序列记录着集合内 A, B, C, D 四个元素的大小。其中每一个比特的含义如下:

第 1 位,表示 A 与 B 的大小关系,为 0 表示 A<B, 为 1 表示 A>B;

第 2 位,表示 B 与 C 的大小关系,为 0 表示 B<C, 为 1 表示 B>C;

第 3 位,表示 C 与 D 的大小关系,为 0 表示 C<D, 为 1 表示 C>D;

第 4 位,表示 A 与 C 的大小关系,为 0 表示 A<C, 为 1 表示 A>C;

第 5 位,表示 B 与 D 的大小关系,为 0 表示 B<D, 为 1 表示 B>D;

第 6 位,表示 A 与 D 的大小关系,为 0 表示 A<D, 为 1 表示 A>D;

根据给定的 0-1 序列,将 A, B, C, D 四个对象按升序排列。

解决方法

可以使用加权法,四个对象的初始权重都赋值为 0,依次判断序列中的每一位值,根据值来给相应的较大对象加权。例如,对于序列 '111111',第 1 位为 1,则对象 B 权重加 1,第 2 位为 1, 则对象 C 权重加 1;以此类推;最后对象 A, B, C, D 的权重分别为 0, 1, 2, 3 , 根据这个权重就可以给四个对象排序了!

代码如下

#include <stdio.h>
#include <stdlib.h>

char tags[6][2] = {
	{ 0, 1 },
	{ 1, 2 },
	{ 2, 3 },
	{ 0, 2 },
	{ 1, 3 },
	{ 0, 3 }
};

char* sort(char *series, int len)
{
	char *data; // tmpser 用来记录 A,B,C,D 四个对象的权重,初始权重都为 0
	char tmpser[4] = {0};
	int i;
	for(i=0; i<len; i++)
	{
		if(series[i] == 0)
			tmpser[tags[i][1]]++;
		else
			tmpser[tags[i][0]]++;
	}	

	data = (char*)malloc(sizeof(char)*4);
	data[tmpser[0]] = 'A';
	data[tmpser[1]] = 'B';
	data[tmpser[2]] = 'C';
	data[tmpser[3]] = 'D';
	
	return data;
}
int main()
{
	char series[6] = { 1, 1, 1, 1 ,1 ,1 };
	char *data, i;
	data = sort(series, 6);
	for(i=0; i<4; i++)
	{
		printf("%c ",data[i]);
	}
	printf("\n");

	return 0;
}

输出结果如下:

D C B A

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值