归并排序
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int N,T,i,j,k,l;
int last;
while(scanf("%d",&T)!=EOF)
{
for(i=1;i<=T;i++)
{
scanf("%d",&N);
double ai[N];
for(j=0;j<N;j++)
{
scanf("%lf",&ai[j]);
}
merge_sort(ai,0,N-1);
if(N%2!=0)
{
printf("%.2f\n",ai[(N+1)/2-1]);
}
else
{
last=ai[(N/2)-1]+ai[N/2];
printf("%.2f\n",last/(double)2);
}
}
}
}
void merge(double a[], int p, int q, int r)
{
int i, j, k, n1, n2;
int *front, *back;
n1 = q - p + 1;
n2 = r-q;
front = (int *) malloc (n1 * sizeof(int));
back = (int *) malloc (n2 * sizeof(int));
for(i = 0; i < n1; i++)
front[i] = a[p + i];
for(i = 0; i < n2; i++)
back[i] = a[q + 1 + i];
i = 0, j = 0, k= p;
while(i < n1 && j < n2)
{
if(front[i] < back[j])
{
a[k++] = front[i++];
}
else
{
a[k++] = back[j++];
}
}
while(i < n1)
{
a[k++] = front[i++];
}
while(j < n2)
{
a[k++] = back[j++];
}
}
void merge_sort(double a[], int p, int r)
{
int q;
if(p < r)
{
q = (p + r)/2;
merge_sort(a, p, q);
merge_sort(a, q + 1, r);
merge(a, p, q, r);
}
}
二分排序
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int N,T,i,j,k,l;
int last;
while(scanf("%d",&T)!=EOF)
{
for(i=1;i<=T;i++)
{
scanf("%d",&N);
double ai[N];
for(j=0;j<N;j++)
{
scanf("%lf",&ai[j]);
}
int len=N;
int left,right,mid,get;
for(k=1;k<len;k++)
{
get=ai[k];
left=0;
right=k-1;
while(left<=right)
{
mid=(left+right)/2;
if(ai[mid]>get) right=mid-1;
else left=mid+1;
}
for(l=k-1;l>=left;l--)
{
ai[l+1]=ai[l];
}
ai[left]=get;
}
if(N%2!=0)
{
printf("%.2f\n",ai[(N+1)/2-1]);
}
else
{
last=ai[(N/2)-1]+ai[N/2];
printf("%.2f\n",last/(double)2);
}
}
}
}