题干如图
一、算法思想
思想一:可以采用二路归并,然后再取中位数
思想二:合并数组,采用快速排序,再取中位数
二、代码如下
#include <stdio.h>
#include <stdlib.h>
/**
* 2011 年代码真题
* 合并数组找中位数
* @return
*/
// 3 1 2 5 4
void Quicksort(int* arr,int start,int end)
{
if(start >= end)
return;
int left = start;
int right = end;
int pivot = arr[left];
while (left < right)
{
while (arr[right] > pivot && left < right)
{
right--;
}
if(left < right)
{
arr[left] = arr[right];
left++;
}
while (arr[left] < pivot && left < right)
{
left++;
}
if(left < right)
{
arr[right] = arr[left];
right--;
}
arr[left] = pivot;
Quicksort(arr,start,left - 1);
Quicksort(arr,right + 1,end);
}
}
//1 2 3 4 5 6
int main() {
int a1[] = {1,2,3};
int a2[] = {4,5,6};
int length1 = sizeof(a1) / sizeof(a1[0]);
int length2 = sizeof(a2) / sizeof(a2[0]);
int *arr = (int *)malloc((length1 + length2) * sizeof(int));
if (arr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
int index = 0;
for (int i = 0; i < length1; i++) {
arr[index++] = a1[i];
}
for (int i = 0; i < length2; i++) {
arr[index++] = a2[i];
}
// 输出合并后的数组
printf("arr: ");
for (int i = 0; i < length1 + length2; i++) {
printf("%d ", arr[i]);
}
printf("\n");
Quicksort(arr,0,(length1 + length2 - 1));
for (int i = 0; i < (length1 + length2); i++) {
printf("%d ",arr[i]);
}
printf("\n");
printf("%d ",arr[(length1+length2)/2]);
}