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;
}
#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
- poj2388Who's in the Middle
- poj2388Who's in the Middle【堆排序】
- poj2388Who's in the Middle(快速排序)
- PKU_ACM_2388_Who's in the Middle
- Who's in the Middle
- Who's in the Middle
- hdu1157Who's in the Middle
- Who's in the Middle
- Who's in the Middle
- Who's in the Middle
- Who's in the Middle
- Who's in the Middle
- Who's in the Middle
- hdu1157Who's in the Middle
- Who's in the Middle
- Who's in the Middle
- Who's in the Middle
- Who's in the Middle
- #android#android studio环境搭建和adb的使用
- 我的第一篇博客
- Uva 10006 Carmichael Numbers(数论、快速幂、素数筛法)
- Android 开发之 App 启动时间统计
- HDU 2044 一只小蜜蜂...
- poj2388Who's in the Middle
- 【ESP8266】app_IR_TxRx_demo中的RingBuf代码透析
- POJ 2418 (简单map)
- poj1511——Invitation Cards(SPFA+邻接表)
- HDU5477 A Sweet Journey
- 运用js简单制作图片的左右移动
- 数字间的转换(进制转换、小数化分数)
- ubuntu下安装vim失败,不满足依赖关系
- hdoj 1513 Palindrome (LCS 变形)