#include<iostream>
using namespace std;
//1-insert sort method
void insert_sort( int *arr, int n )
{
int i, k;
for( i=1; i<n; ++i )
{
for( k=i; k>0; --k )
{
if( arr[k] < arr[k-1] )
{
int tmp = arr[k-1];
arr[k-1] = arr[k];
arr[k]=tmp;
}
}
}
}
//2-select sort method
void select_sort( int *arr, int n )
{
int i,k;
for( i=0; i<n-1; ++i )
{
for( k=i+1; k<n; ++k )
{
if( arr[k] < arr[i] )
{
int tmp = arr[i];
arr[i] = arr[k];
arr[k] = tmp;
}
}
}
}
//3-buble sort method
void buble_sort( int *arr, int n )
{
int i, k;
for( k=n-1; k>0; --k )
{
for( i=0; i<k; ++i )
{
if( arr[i] > arr[i+1] )
{
int tmp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
}
}
}
}
//4-bidirection bublle sort method
void bibuble_sort( int *arr, int n )
{
int left=0,right=n-1;
int i;
while(left<right)
{
//move right
for( i=left;i<right; ++i )
{
if( arr[i]>arr[i+1] )
{
int tmp = arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
}
}
--right;
//move left
for( i=right; i>left; --i )
{
if( arr[i]<arr[i-1] )
{
int tmp = arr[i];
arr[i]=arr[i-1];
arr[i-1]=tmp;
}
}
}
}
//5-quick sort method
int quick_part( int*arr, int left, int right )
{
int val = arr[left], tmp;
int i=left+1,k=right;
while(1)
{
for( ; i<k; ++i )
{
if( arr[i] > val )
break;
}
for( ; k>i; --k )
{
if( arr[k] < val )
break;
}
if( i>=k )
break;
tmp = arr[i];
arr[i]=arr[k];
arr[k] = tmp;
++i, --k;
}
if( i==k )
{
if( arr[i] > val )
--i;
}
else
{
--i;
}
arr[left]=arr[i];
arr[i] = val;
return i;
}
void quick_sort( int *arr, int left, int right )
{
if( left < right )
{
int idx = quick_part( arr, left, right );
quick_sort( arr, left, idx-1 );
quick_sort( arr, idx+1, right );
}
}
//6-shell sort method
void shell( int *arr, int step, int n )
{
int i, k;
for( i=step;i<n; i+=step )
{
for( k=i; k>0; k-=step )
{
if( arr[k] < arr[k-step] )
{
int tmp = arr[k-step];
arr[k-step]=arr[k];
arr[k] = tmp;
}
}
}
}
void shell_sort( int *arr, int n )
{
int step = 5;
while(step>0)
{
shell( arr, step, n );
step /= 2;
}
}