算法导论 练习题 9.3-7

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define LEN 10

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

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

int at(int a[],int p,int r,int i)
{
	int q=partition(a,p,r);
	int k=q-p+1;
	if(i==k)
		return a[q];
	else if(i<k)
		return at(a,p,q-1,i);
	else
		return at(a,q+1,r,i-k);
}

int main()
{
	int k=5;
	int a[LEN+1]={INT_MIN,90,4,77,89,23,6,11,45,65,70};
	int mid=LEN/2;
	int midEl=at(a,1,LEN,mid);
	int leftEls=k/2,rightEls=k-k/2,leftPos,rightPos,left,right;
	if(mid-1 < leftEls)
	{
		leftPos=1;
		rightEls=k-mid+1;
		rightPos=at(a,mid+1,LEN,mid+rightEls);
	}
	else
	{
		leftPos=mid-leftEls;
		left=at(a,1,LEN,leftPos);
		if(LEN-mid<rightEls)
			rightPos=LEN;
		else
		{
			rightPos=mid+rightEls;
			right=at(a,1,LEN,rightPos);
		}
	}
	printf("中位数是:%d\n",midEl);
	for(int i=leftPos;i<=rightPos;i++)
	{
		if(i!=mid)
			printf("%d ",a[i]);
	}
	getchar();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值