您的位置:首页 > 其它

PTA 求自定类型元素序列的中位数,冒泡超时,改为希尔排序

2017-03-15 17:07 330 查看
4-11 求自定类型元素序列的中位数   (25分)本题要求实现一个函数,求
N
个集合元素
A[]
的中位数,即序列中第\lfloorN/2 +1\rfloor⌊N/2+1⌋大的元素。其中集合元素的类型为自定义的
ElementType

函数接口定义:

ElementType Median( ElementType A[], int N );
其中给定集合元素存放在数组
A[]
中,正整数
N
是数组元素个数。该函数须返回
N
A[]
元素的中位数,其值也必须是
ElementType
类型。

裁判测试程序样例:

#include <stdio.h>#define MAXN 10typedef 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
ElementType Median( ElementType A[], int N )
{
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
if(A[i] < A[j])
{
ElementType t = A[j];
A[j] = A[i];
A[i] = t;
}
}
}
//for(int i = 0; i < N; i++)printf("%f ",  A[i] );
return A[N/2];
}
冒泡最后两个测试过不了改为希尔
ElementType Median(ElementType A[], int N)
{
int i, j, Increment;
ElementType Tmp;
for (Increment = N / 2; Increment > 0; Increment /= 2) { //设置增量,一般为数组长度的一半
for (i = Increment; i < N; i++) {
Tmp = A[i];//将A[5]的值存到临时变量temp中
for (j = i; j >= Increment; j -= Increment) {
if (Tmp < A[j - Increment])//如果A[5]的值小于A[0],则把A[0]的值赋给A[5]
{
A[j] = A[j - Increment];
}
else
break;
}
A[j] = Tmp;//因为J经过递减,此时A[J]其实为A[0],把TEMP中A[5]的初始值赋予A[0],完成两个位置的值的交换
}
}
return A[N / 2];
}
关于希尔排序这篇博文 :http://blog.csdn.net/morewindows/article/details/6668714

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  希尔排序