算法导论 思考题 9-2

b.

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

void merge(float a[],int p,int q,int r)
{	
	int l=r-p+1,l1=q-p+1,l2=r-q,i,j,k;
	float *t1=(float*)malloc((l1+1)*sizeof(float));
	float *t2=(float*)malloc((l2+1)*sizeof(float));
	for(i=0;i<l1;i++)
	{
		t1[i]=a[p+i];
	}
	t1[i]=DBL_MAX;
	for(j=0;j<l2;j++)
	{
		t2[j]=a[q+j+1];
	}
	t2[j]=DBL_MAX;
	i=j=0;
	for(k=0;k<l;k++)
	{
		if(t1[i]<=t2[j])
			a[k+p]=t1[i++];
		else
			a[k+p]=t2[j++];
	}
	free(t1);
	free(t2);
}

void mergeSort(float a[],int p,int r)
{
	if(p>=r)
		return;
	int q=(p+r)/2;
	mergeSort(a,p,q);
	mergeSort(a,q+1,r);
	merge(a,p,q,r);
}

void printA(float a[],int len)
{
	for(int i=0;i<len;i++)
	{
		printf("%.2f ",a[i]);
	}
	printf("\n");
}

int getWMid(float a[],int len)
{
	float sum=0.0;
	int i;
	for(i=0;i<len;i++)
	{
		sum+=a[i];
		if(sum>=0.5)
			break;
	}
	return i;
}

void main()
{
	float a[7]={0.1,0.35,0.05,0.1,0.15,0.05,0.2};
	mergeSort(a,0,6);
	printA(a,7);
	int k=getWMid(a,7);
	printf("%.2f ",a[k]);
	getchar();
}
c.

void swop(float* a,float* b)
{
	float temp=*a;
	*a=*b;
	*b=temp;
}

int partition(float a[],int p,int r)
{
	int i=p-1,j;
	float x=a[r];
	for(j=p;j<r;j++)
	{
		if(a[j]<x)
		{
			i++;
			swop(&a[j],&a[i]);
		}
	}
	swop(&a[r],&a[i+1]);
	
	return i+1;
}

float at(float a[],int p,int r,float w)
{
	if(p>=r)
		return a[p];
	int q=partition(a,p,r);
	float sum=0.0;
	for(int i=p;i<q;i++)
		sum+=a[i];
	if(sum<w && sum+a[q]>w)
		return a[q];
	else if(sum>w)
		return at(a,p,q-1,w);
	else
		return at(a,q,r,w-sum);
}

d. 与距离无关,只与权重有关。

e. 对x和y各执行一遍c,相应的点就是答案了




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值