题目思路(参考):找两个数组的中位数,首先合并两个顺序表,不需要传入引用类型,只要找到中位数就好了,想减少空间复杂度,可以把顺序表L1直接放在顺序表L2里面的后面,这样不用开辟新的空间复杂度就是O(1)。合并完成后可以进行冒泡排序,然后直接根据最中间位置元素的下标进行查找,按照题目的意思对应的是L.data((L.length-1)/2),时间复杂度,合并顺序表O(n),冒泡排序O(n^2),按索引查找O(1),根据时间复杂度的加法原则,总的时间复杂度是O(n^2)
#include<stdio.h>
#include <stdlib.h>
#include<malloc.h>
#define InitSize 100//表的初始长度定义
typedef struct{
int *data;
int MaxSize,length;
}SeqList;
//初始化动态顺序表
void InitList(SeqList &L){
L.data=(int*)malloc(sizeof(int)*InitSize);
L.MaxSize=InitSize;
L.length=0;
}
//创建动态态顺序表
void CreateList(SeqList &L) {
int num;
printf("请输入要往顺序表中加入的整数(输入9999退出):");
while(scanf("%d", &num) == 1 && num != 9999 && L.length < L.MaxSize)
{
L.data[L.length++] = num;
printf("顺序表的长度是:%d\n", L.length);
printf("剩余位置的数量:%d\n", L.MaxSize - L.length);
printf("请输入要往顺序表中加入的整数(输入9999退出):");
}
}
//初始化动态顺序表
void TravelList(SeqList L){
for(int i=0;i<L.length;i++){
printf("%d ",L.data[i]);
}
printf("\n");
}
void EndInsert(SeqList &L,int e){
L.data[L.length++]=e;
}
void Find_median(SeqList L1,SeqList L2){
for(int i=0;i<L1.length;i++){
EndInsert(L2,L1.data[i]);
}//
for(int i=0;i<L2.length-1;i++){
int temp;
for(int j=0;j<L2.length-1-i;j++){
if(L2.data[j]>L2.data[j+1]){
temp=L2.data[j];
L2.data[j]=L2.data[j+1];
L2.data[j+1]=temp;
}
}
}
printf("合并后的顺序表是:");
TravelList(L2);
printf("中位数是:%d",L2.data[(L2.length-1)/2]);
}
int main(){
SeqList L1,L2;
InitList(L1);
InitList(L2);
printf("请按照从小到大的顺序创建顺序表L1:\n");
CreateList(L1);
printf("请按照从小到大的顺序创建顺序表L2:\n");
CreateList(L2);
printf("动态顺序表L1遍历的结果是:");
TravelList(L1);
printf("动态顺序表L2遍历的结果是:");
TravelList(L2);
Find_median(L1,L2);
return 0;
}