做题时只提交核心函数的代码即可
// 核心函数
ElementType Median(ElementType array[], int num);
ElementType FindKthLargestNumber(ElementType array[], int num, int k);
int Partition(ElementType array[], int num);
void Swap(ElementType *a, ElementType *b);
ElementType Median(ElementType array[], int num)
{
ElementType median = FindKthLargestNumber(array, num, (num + 1) / 2);
return median;
}
ElementType FindKthLargestNumber(ElementType array[], int num, int k)
{
if (num < k)
{
perror("Invalid input");
exit(1); // TODO: error handling
}
if (1 == num)
{
return array[0];
}
int pivotIndex = Partition(array, num);
if (pivotIndex == k - 1)
{
return array[pivotIndex];
}
if (pivotIndex > k - 1)
{
return FindKthLargestNumber(array, pivotIndex, k);
}
return FindKthLargestNumber(array + (pivotIndex + 1),
num - (pivotIndex + 1),
k - (pivotIndex + 1));
}
int Partition(ElementType array[], int num)
{
int pivotIndex = num - 1;
ElementType pivot = array[pivotIndex];
int left = 0;
int right = num - 2;
while (left <= right)
{
for (; left <= right && array[left] > pivot; ++left)
;
for (; left <= right && array[right] <= pivot; --right)
;
if (left < right)
{
Swap(&array[left], &array[right]);
++left;
--right;
}
// if (left == right) is impossible
if (left > right)
{
Swap(&array[left], &array[pivotIndex]);
pivotIndex = left;
break;
}
}
return pivotIndex;
}
void Swap(ElementType *a, ElementType *b)
{
ElementType tmp = *a;
*a = *b;
*b = tmp;
}
本题要求实现一个函数,求N
个集合元素A[]
的中位数,即序列中第⌊(N+1)/2⌋
大的元素。其中集合元素的类型为自定义的ElementType
。
函数接口定义:
ElementType Median(ElementType A[], int N);
其中给定集合元素存放在数组A[]
中,正整数N
是数组元素个数。该函数须返回N
个A[]
元素的中位数,其值也必须是ElementType
类型。
完整的可执行代码(可以直接在本地编译并运行):
#include <stdio.h>
#define MAX_NUMBER 10
typedef float ElementType;
ElementType Median(ElementType A[], int N);
int main(void)
{
ElementType array[MAX_NUMBER];
int N = 0;
scanf("%d", &N);
for (int idx = 0; idx < N; ++idx)
{
scanf("%f", &array[idx]);
}
printf("%.2f\n", Median(array, N));
return 0;
}
ElementType Median(ElementType array[], int num);
ElementType FindKthLargestNumber(ElementType array[], int num, int k);
int Partition(ElementType array[], int num);
void Swap(ElementType *a, ElementType *b);
ElementType Median(ElementType array[], int num)
{
ElementType median = FindKthLargestNumber(array, num, (num + 1) / 2);
return median;
}
ElementType FindKthLargestNumber(ElementType array[], int num, int k)
{
if (num < k)
{
perror("Invalid input");
exit(1); // TODO: error handling
}
if (1 == num)
{
return array[0];
}
int pivotIndex = Partition(array, num);
if (pivotIndex == k - 1)
{
return array[pivotIndex];
}
if (pivotIndex > k - 1)
{
return FindKthLargestNumber(array, pivotIndex, k);
}
return FindKthLargestNumber(array + (pivotIndex + 1),
num - (pivotIndex + 1),
k - (pivotIndex + 1));
}
int Partition(ElementType array[], int num)
{
int pivotIndex = num - 1;
ElementType pivot = array[pivotIndex];
int left = 0;
int right = num - 2;
while (left <= right)
{
for (; left <= right && array[left] > pivot; ++left)
;
for (; left <= right && array[right] <= pivot; --right)
;
if (left < right)
{
Swap(&array[left], &array[right]);
++left;
--right;
}
// if (left == right) is impossible
if (left > right)
{
Swap(&array[left], &array[pivotIndex]);
pivotIndex = left;
break;
}
}
return pivotIndex;
}
void Swap(ElementType *a, ElementType *b)
{
ElementType tmp = *a;
*a = *b;
*b = tmp;
}
输入样例:
3
12.3 34 -5
输出样例:
12.30