poj2388Who's in the Middle

来源:互联网 发布:淘宝小野妹子是正品吗 编辑:程序博客网 时间:2024/06/08 02:08
//插入排序 79ms  
  
#include <iostream>  
using namespace std;  
  
void InsertSort(int a[], int n)  
{  
    int i,j,tmp;  
    for(i = 1; i < n; i++)  
    {  
        tmp = a[i];  
        for(j = i; j > 0 && a[j-1] > tmp; j--)  
            a[j] = a[j-1];  
        a[j] = tmp;  
    }  
}  
int main()  
{  
    int n,i;  
    int a[10002];  
  
    scanf("%d",&n);  
    for(i = 0; i < n; i++)  
       scanf("%d",&a[i]);  
    InsertSort(a,n);  
    printf("%d\n",a[(n-1)/2]);  
    return 0;  
}  
  
//增量较差的希尔排序 32ms  
  
#include <iostream>  
using namespace std;  
  
void ShellSort( int a[], int n )  
{  
    int i,j,tmp,increment;  
  
    for( increment = n/2; increment > 0; increment /= 2 )  
        for( i = increment; i < n; i++ )  
        {  
            tmp = a[i];  
            for( j = i; j >= increment; j -= increment )  
                if( a[j-increment] > tmp )  
                    a[j] = a[j-increment];  
                else break;  
            a[j] = tmp;  
        }  
}  
int main()  
{  
    int n,i;  
    int a[10002];  
  
    scanf("%d",&n);  
    for(i = 0; i < n; i++)  
       scanf("%d",&a[i]);  
    ShellSort(a,n);  
    printf("%d\n",a[(n-1)/2]);  
    return 0;  
}  
  
  
//Hibbard增量希尔排序 32ms  
  
#include <iostream>  
#include <cmath>  
using namespace std;  
int Hibbard[15];  
  
void ShellSort( int a[], int n )  
{  
    int i,j,k,tmp,increment;  
      
    for( k = 0; k < 15; k++ )  
        if( Hibbard[k] < n && Hibbard[k+1] >= n )  
        {  
            increment = Hibbard[k];  
            break;  
        }  
    for(; k >= 0; increment = Hibbard[--k] )  
        for( i = increment; i < n; i++ )  
        {  
            tmp = a[i];  
            for( j = i; j >= increment; j -= increment )  
                if( a[j-increment] > tmp )  
                    a[j] = a[j-increment];  
                else break;  
            a[j] = tmp;  
        }  
}  
int main()  
{  
    int n,i;  
    int a[10002];  
    for( i = 1; i < 15; i++ )  
        Hibbard[i-1] = pow(2.0,i+0.0)-1;  
      
    scanf("%d",&n);  
    for(i = 0; i < n; i++)  
       scanf("%d",&a[i]);  
    ShellSort(a,n);  
    printf("%d\n",a[(n-1)/2]);  
    return 0;  
}  
  
  
//堆排序 16ms  
#include <iostream>  
using namespace std;  
#define leftChild(i) 2*i+1  
  
void Swap( int *a, int *b )  
{  
  int hold = *b;  
  
  *b = *a;  
  *a = hold;  
}  
void PercDown( int a[], int i, int n )  
{  
    int child,tmp;  
  
    tmp = a[i];  
    for(; leftChild(i) < n; i = child )  
    {  
        child = leftChild(i);  
        if( child != n-1 && a[child+1] > a[child] )  
            child++;  
        if( tmp < a[child] )  
            a[i] = a[child];  
        else break;  
    }  
    a[i] = tmp;    
}  
void HeapSort( int a[], int n )  
{  
    int i;  
  
    for( i = n/2; i >= 0; i-- )  
        PercDown( a, i, n );  
    for( i = n-1; i > 0; i-- )  
    {   
       Swap( &a[0], &a[i] );  
       PercDown( a, 0, i );  
    }  
}  
int main()  
{  
    int n,i;  
    int a[10002];  
  
    scanf("%d",&n);  
    for(i = 0; i < n; i++)  
       scanf("%d",&a[i]);  
    HeapSort(a,n);  
    printf("%d\n",a[(n-1)/2]);  
    return 0;  
}  
  
  
//归并排序 32ms  
#include <iostream>  
#include <cstdlib>  
using namespace std;  
  
void Merge( int a[], int tmpArray[], int l_sta, int r_sta, int r_end )  
{  
    int l_end = r_sta-1;  
    int size = r_end-l_sta+1;  
    int id = l_sta;  
  
    while( l_sta <= l_end && r_sta <= r_end )  
        if( a[l_sta] <= a[r_sta] )  
            tmpArray[id++] = a[l_sta++];  
        else  
            tmpArray[id++] = a[r_sta++];  
    while( l_sta <= l_end )  
        tmpArray[id++] = a[l_sta++];  
    while( r_sta <= r_end )  
        tmpArray[id++] = a[r_sta++];  
  
    for( int i = 0; i < size; i++,r_end-- )  
        a[r_end] = tmpArray[r_end];  
}  
  
void Msort( int a[], int tmpArray[], int left, int right )  
{  
    int center;  
  
    if( left < right )  
    {  
        center = ( left+right )/2;  
        Msort( a, tmpArray, left, center );  
        Msort( a, tmpArray, center+1, right );  
        Merge( a, tmpArray, left, center+1, right );  
    }  
}  
void MergeSort( int a[], int n )  
{  
   int *tmpArray;  
  
   tmpArray = (int*)malloc( n*sizeof(int) );  
   if( tmpArray != NULL )  
   {  
       Msort( a, tmpArray, 0, n-1 );  
       free( tmpArray );  
   }  
}  
int main()  
{  
    int n,i;  
    int a[10002];  
  
    scanf("%d",&n);  
    for(i = 0; i < n; i++)  
       scanf("%d",&a[i]);  
    MergeSort(a,n);  
    printf("%d\n",a[(n-1)/2]);  
    return 0;  
}  
  
  
//三数中值分割法实现的快排 47ms  
#include <iostream>  
using namespace std;  
#define cutoff 3  
  
void Swap( int *a, int *b )  
{  
  int hold = *b;  
  
  *b = *a;  
  *a = hold;  
}  
  
void InsertSort(int a[], int n)  
{  
    int i,j,tmp;  
    for(i = 1; i < n; i++)  
    {  
        tmp = a[i];  
        for(j = i; j > 0 && a[j-1] > tmp; j--)  
            a[j] = a[j-1];  
        a[j] = tmp;  
    }  
}  
int Median3( int a[], int left, int right )  
{  
    int center = ( left+right )/2;  
  
    if( a[left] > a[center] )  
        Swap( &a[left], &a[center] );  
    if( a[left] > a[right] )  
        Swap( &a[left], &a[right] );  
    if( a[center] > a[right] )  
        Swap( &a[center], &a[right] );  
    Swap( &a[center], &a[right-1] );  
    return a[right-1];  
}  
void Qsort( int a[], int left, int right )  
{  
  int i, j;  
  int Pivot;  
    
  if( left+cutoff <= right )  
  {  
     Pivot = Median3( a, left, right );  
     i = left;   
     j = right-1;  
     for( ; ; )  
     {  
         while( a[++i] < Pivot ) {}  
         while( a[--j] > Pivot ) {}  
         if( i < j )  
             Swap( &a[i], &a[j] );  
         else break;  
     }  
     Swap( &a[i], &a[right-1] );  
  
     Qsort( a, left, i-1 );  
     Qsort( a, i+1, right );  
  }  
  else InsertSort( a+left, right-left+1 );  
}  
int main()  
{  
    int n,i;  
    int a[10002];  
  
    scanf("%d",&n);  
    for(i = 0; i < n; i++)  
       scanf("%d",&a[i]);  
    Qsort( a, 0, n-1 );  
    printf("%d\n",a[(n-1)/2]);  
    return 0;  
}  
//以中间值为枢纽元的快排 16ms  
<pre><pre class="cpp" name="code">#include <iostream>  
#include <cstdio>  
using namespace std;  
  
void Swap( int &a, int &b )  
{  
  int hold = b;  
  
  b = a;  
  a = hold;  
}  
  
void Qsort( int a[], int left, int right )  
{  
  int i, j;  
  int mid;  
  int m;  
  
  if( left < right )  
  {  
     i = left - 1;  
     j = right;  
     mid = (left+right)/2;  
     m = a[mid];  
     Swap( a[mid], a[right] );  
     for( ; ; )  
     {  
         while( a[++i] < m ) {}  
         while( a[--j] > m ) {}  
         if( i < j )  
             Swap( a[i], a[j] );  
         else break;  
     }  
     Swap( a[i], a[right] );  
     Qsort( a, left, i-1 );  
     Qsort( a, i+1, right );  
  }  
}  
int main()  
{  
    int n,i;  
    int a[10002];  
  
    scanf("%d",&n);  
    for(i = 0; i < n; i++)  
       scanf("%d",&a[i]);  
    Qsort( a, 0, n-1 );  
    printf("%d\n",a[(n-1)/2]);  
    return 0;  
}  
 
0 0