近段时间在刷PTA,想不到基础编程题都够我喝一壶,弱弱地打击了一下我的积极性,但是题还是要刷的对吧。下面是题目
6-11 求自定类型元素序列的中位数(25 分)
本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第⌊N/2+1⌋大的元素。其中集合元素的类型为自定义的ElementType。
函数接口定义:
ElementType Median( ElementType A[], int N );
其中给定集合元素存放在数组A[]中,正整数N是数组元素个数。该函数须返回N个A[]元素的中位数,其值也必须是ElementType类型。
裁判测试程序样例:
#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;
}
/* 你的代码将被嵌在这里 */
输入样例:
3
12.3 34 -5
输出样例:
12.30
问题在于用例5,无论用冒泡、快排和插入都是运行超时,最后模仿网上(http://blog.youkuaiyun.com/qq_35283188/article/details/77916599)用希尔排序才完成。此文当作记录一下初步学习这几种排序的笔记
0 sample, 小奇数 答案正确 2 ms 128KB
1 偶数个 答案正确 2 ms 128KB
2 最小N 答案正确 1 ms 128KB
3 超过10,中位数是最后1个 答案正确 2 ms 128KB
4 超过10,中位数是第1个 答案正确 2 ms 164KB
5 大N,卡时 运行超时 0 ms 0KB
#include <stdio.h>
#define MAXN 10
typedef float ElementType;
ElementType Median( ElementType A[], int N );
void showarray( ElementType a[], int len );
void quicksort( ElementType A[], int l, int r);
void bubblesort( ElementType A[], int N );
void insertsort( ElementType a[], int len );
void shellsort(ElementType a[], int len);
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));
system("pause");
}
ElementType Median( ElementType A[], int N )
{
int j;
j = N/2;
//quicksort(A, 0, N-1);
shellsort(A, N);
printf("\n*********************Final********************\n");
showarray(A,N);
printf("\n*********************Final********************\n");
return A[j];
}
void shellsort(ElementType a[], int len)
{
int gap, i, j;
ElementType tmp;
for(gap = len/2; gap>0; gap/=2)
{
for(i=gap; i<len; i++)
{
tmp = a[i];
for(j=i; j>0 && a[j-gap]>tmp; j-=gap)
{
a[j] = a[j-gap]; //前一位和当前位a[j]交换
}
a[j] = tmp;
}
}
}
/** 插入排序,先小范围比较,再慢慢扩大
* 例如数组 a[12 45 1 902 32 42 3 53]
* 先取12 ,往前没有数比较,不管,直接下一步
* 再取45,形成[12, 45],45往前和12比较,12<45,位置不变
* 再取1,形成[12, 45, 1],1往前和45比较,45比1大,则a[2]变成45(45退一位,45本来是a[1]),a[1]空出;1再往前和12比,12比1大,所以a[1]变成12,不能再往前,a[0]=0
* 再取902,形成[1, 12, 45, 902],不变
* 再取32,形成[1, 12, 45, 902, 32],32和902比,902比32大,则a[4]变成902;32再往前和45比,45比32大,则a[3] = 45;32再往前和12比,12不比32大,所以结束for循环,此时,j为a[2](即45之前的位置)
*
*/
void insertsort( ElementType a[], int len )
{
int i,j;
ElementType tmp;
for(i=0; i<len; i++)
{
tmp = a[i];
for(j=i; j>0 && a[j-1]>tmp; j--)
{
a[j] = a[j-1]; //前一位和当前未a[j]交换
}
a[j] = tmp;
}
}
/**< 这里是快排 */
void quicksort( ElementType A[], int l, int r)
{
ElementType tmp;
int i, j;
if(l < r)
{
i = l;
j = r;
tmp = A[i];
while(i < j)
{
while(A[j]>tmp && i<j) //一定要i<j,因为下面j--改变了j的值,没有这个判定,无法跳过A[j]大于tmp不用改变j值的情况
j--; //由右往左寻找,遇到A[j]>tmp则跳过,寻找下一个
if(i<j)
{
A[i] = A[j];
i++;
}
while(A[i]<tmp && i<j) //改变这里的A[i]<tmp小于的符号,同时改变42行A[j]>tmp的大于符号,可以改为由大到小排列
i++;
if(i<j)
{
A[j] = A[i];
j--;
}
//showarray(A, r+1);
//printf("\n***************************\n");
}
/**< 如果r == l,下面的语句不会执行,这也是迭代停止的条件 */
A[i] = tmp;
quicksort(A, l, i-1);
quicksort(A, i+1, r);
}
}
/**< 下面是冒泡排序 */
void bubblesort( ElementType A[], int N )
{
ElementType temp;
int i, j;
for(i=0; i<N-1; i++)
{
for(j=0; j<N-i-1; j++)
{
if(A[j+1]<A[j]) //从大到小排列
{
//printf("A[%d]:%.2f > A[%d]:%.2f ??\n", j+1, A[j+1], j, A[j]);
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}
}
}
}
void showarray(ElementType a[], int len)
{
int j;
for(j=0; j<len; j++)
{
printf("a[%d]:%.2f\t", j, a[j]);
}
}
然后继续段错误。。。。。真的一点脾气都没有。到底哪里出错了。