【2011统考真题】一个长度为L(L≥1)的升序序列S,处在第L/2个位置的数称为S的中位数。例如,若序列S=(11,13,15,17,19),则S的中位数是15,两个序列的中位数是含它们所有元素的升

【2011统考真题】一个长度为L(L≥1)的升序序列S,处在第L/2个位置的数称为S的中位数。例如,若序列S=(11,13,15,17,19),则S的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S=(2,4,6,8,20),则S和S的中位数是11。现在有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能、高效的算法,找出两个序列A和B的中位数。

代码思路:
这里题目说了是给两个等长的序列A,B,那么找中位数其实就是归并排序,每次从两个序列中选一个小的放到新序列中,等新序列长度等于序列A(B)的长度时,最后一个插进新序列的就是中位数。

void find_mid(Sqlist A, Sqlist B,Sqlist* C) {
	int i = 0;
	int j = 0;
	int k = 0;
	while (i < A.length&&j < B.length) {
		if (k == A.length) {
			break;
		}
		if (A.data[i] < B.data[j]) {
			(*C).data[k] = A.data[i];
			i++;
		}
		else {
			(*C).data[k] = B.data[j];
			j++;
		}
		k++;
	}
}
int main() {
	Sqlist A;
	InitList1(&A);//把A初始化为(11,13,15,17,19)
	printf("初始A序列为:");
	print(&A);
	printf("\n");
	Sqlist B;
	InitList2(&B);//把B初始化为(2,4,6,8,20)
	printf("初始B序列为:");
	print(&B);
	printf("\n");

	Sqlist C;
	InitList(&C);
	
	find_mid(A, B, &C);
	int mid = C.data[A.length - 1];
	printf("中位数为%d", mid);
	return 0;

}

ps:顺序表定义及初始化,还有打印顺序表的函数print

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#define MaxSize 10//定义最大长度
int InitArr[10] = { 0 };
int Initarr[10] = {11,13,15,17,19};
int Initbrr[10] = {2,4,6,8,20};

typedef struct {
	int data[MaxSize];//用静态的数据存放数据元素
	int length;//顺序表当前长度
}Sqlist;//顺序表的类型定义

//初始化一个顺序表
void InitList(Sqlist* L)
{
	for (int i = 0;i < MaxSize;i++)
	{
		L->data[i] = InitArr[i];//将所有数据元素设置为默认初始值
	}
	L->length = 10;//顺序表初始长度为0
}

void print(Sqlist* L)
{
	for (int i = 0;i < L->length;i++)
	{
		printf("%d ", L->data[i]);
	}
}

//初始化一个顺序表A
void InitList1(Sqlist* L)
{
	for (int i = 0;i < 5;i++)
	{
		L->data[i] = Initarr[i];//将所有数据元素设置为默认初始值
	}
	L->length = 5;//顺序表初始长度为5
}
//初始化一个顺序表B
void InitList2(Sqlist* L)
{
	for (int i = 0;i < 5;i++)
	{
		L->data[i] = Initbrr[i];//将所有数据元素设置为默认初始值
	}
	L->length = 5;//顺序表初始长度为4
}

你可能感兴趣的:(数据结构代码汇总,算法,找两序列中位数,数据结构,考研真题)