#include <stdio.h>
#define MAXN 10
typedef float ElementType;
ElementType Median( ElementType A[], int N );
int main ()
{
ElementType A[MAXN];
int N, i;
scanf("%d", &N);
for ( i=0; i<N; i++ )
scanf("%f", &A[i]);
printf("%.2f\n", Median(A, N));
return 0;
}
/* 你的代码将被嵌在这里 */
我的答案如下:
ElementType Median( ElementType A[], int N ){
float arr[MAXN];
for(int i=0;i<N;i++){
for(int j=i+1;j<N;j++){
if(arr[i]>arr[j]){
float t;
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
}
}
int i=(N+1)/2-1;
return arr[i];
}
供参考:
/* 你的代码将被嵌在这里 */
ElementType Median(ElementType A[], int N)
{
//必须采用希尔排序
ElementType temp;
int gap, i, j;
for (gap = N / 2; gap > 0; gap /= 2)
//gap是每次排序分组的间隔,每次间隔缩小两倍
{
for (i = gap; i < N; i++)
//在同一组内采用直接插入排序
{
for (j = i - gap; j >= 0 && A[j] > A[j + gap]; j = j - gap)
//如果同一组内前一个元素大于相 gap间隔位置的元素,则两者交换位置
{
temp = A[j];
A[j] = A[j + gap];
A[j + gap] = temp;
}
}
}
return A[N / 2];//返回中间元素
}
ElementType Median( ElementType A[], int N ){
float arr[MAXN];
for(int i=0;i<N;i++){
for(int j=0;j<N-i-1;j++){
if(arr[j]>arr[j+1]){
float t;
t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
int i=(N+1)/2-1;
return arr[i];
}
可以将排序数组的算法改为希尔排序,以应对测试大数组时超时的问题。
测试如下:
参考链接:
#include <stdio.h>
#define MAXN 10
typedef float ElementType;
ElementType Median( ElementType A[], int N );
int main ()
{
ElementType A[MAXN];
int N, i;
scanf("%d", &N);
for ( i=0; i<N; i++ )
scanf("%f", &A[i]);
printf("%.2f\n", Median(A, N));
return 0;
}
/* 你的代码将被嵌在这里 */
ElementType Median( ElementType A[], int N ){
float * arr = A;
int len = N;
// https://zhuanlan.zhihu.com/p/125737294
// https://zhuanlan.zhihu.com/p/122632213
// https://pintia.cn/problem-sets/14/exam/problems/743?type=6&page=0
// 采用希尔排序来排序大量数据的数组
int gap, i, j;
float temp;
for (gap = len >> 1; gap > 0; gap >>= 1)
for (i = gap; i < len; i++) {
temp = arr[i];
for (j = i - gap; j >= 0 && arr[j] < temp; j -= gap)
arr[j + gap] = arr[j];
arr[j + gap] = temp;
}
// 排序后,返回第((N+1)/2)位置的元素
int k=(N+1)/2-1;
return A[k];
}
试试
#include <stdio.h>
#include <stdlib.h>
#define MAXN 10
typedef float ElementType;
int cmp(const void *a, const void *b) {
return *(ElementType *)a > *(ElementType *)b;
}
ElementType Median(ElementType A[], int N) {
qsort(A, N, sizeof(ElementType), cmp);
int i = (N + 1) / 2 - 1;
return A[i];
}
int main() {
ElementType A[MAXN];
int N, i;
scanf("%d", &N);
for (i = 0; i < N; i++)
scanf("%f", &A[i]);
printf("%.2f\n", Median(A, N));
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:-----------------------------------------------------------------------------------------------------------------
请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。