#include
//直接插入排序
void InsertSort(int a[], int n)
{
int i, j;
int temp;
for(i = 1; i <= n-1; ++i)
{
temp = a[i];
for(j = i-1; j >= 0 && a[j] > temp; --j)
{
a[j+1] = a[j];
}
a[j+1] = temp;
}
}
//折半插入排序
void BinaryInsertSort(int a[], int n)
{
int i, j, low, heigh, mid;
int temp;
for(i = 1; i <= n-1; ++i)
{
temp = a[i];
low = 0;
heigh = i-1;
while(low <= heigh)
{
mid = (low + heigh) / 2;
if(a[mid] > temp)
{
heigh = mid - 1;
}
else
{
low = mid + 1;
}
}
for(j = i-1; j >= heigh+1; --j)
{
a[j+1] = a[j];
}
a[heigh + 1] = temp;
}
}
//希尔排序
void ShellSort(int a[], int n)
{
int i, j, dk;
int temp;
for(dk = n/2; dk > 0; dk /= 2)
{
for(i = dk; i <= n-1; ++i)
{
temp = a[i];
for(j = i-dk; j >= 0 && a[j] > temp; j -= dk)
{
a[j+dk] = a[j];
}
a[j+dk] = temp;
}
}
}
//冒泡排序
void BubbleSort(int a[], int n)
{
int i, j;
int temp;
for(i = 1; i <= n-1; ++i)
{
bool flag = false;
for(j = 0; j <= n-1-i; ++j)
{
if(a[j] > a[j+1])
{
flag = true;
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
if(flag == false)
return;
}
}
//快速排序
int Partition(int a[], int low, int heigh)
{
int posTemp = a[low];
while(low < heigh)
{
while(low < heigh && a[heigh] >= posTemp)
{
--heigh;
}
a[low] = a[heigh];
while(low < heigh && a[low] <= posTemp)
{
++low;
}
a[heigh] = a[low];
}
a[low] = posTemp;
return low;
}
void QuickSort(int a[], int low, int heigh)
{
if(low < heigh)
{
int Pos = Partition(a,low,heigh);
QuickSort(a,low,Pos-1);
QuickSort(a,Pos+1,heigh);
}
}
//简单选择排序
void SelectSort(int a[], int n)
{
int i, j, temp;
for(i = 0; i < n-1; ++i)
{
int pos = i;
for(j = i+1; j < n; ++j)
{
if(a[j] < a[pos])
{
pos = j;
}
}
if(pos != i)
{
temp = a[i];
a[i] = a[pos];
a[pos] = temp;
}
}
}
//堆排序
void AdjustDown(int a[], int i, int n)
{
int largest;
int temp = a[i];
for(largest = 2*i+1; largest < n; largest = 2*largest+1)
{
if(largest != n-1 && a[largest+1] > a[largest])
{
largest++;
}
if(temp < a[largest])
{
a[i] = a[largest];
i = largest;
}
else
{
break;
}
}
a[i] = temp;
}
void BuildMaxHeap(int a[], int n)
{
for(int i = n/2-1; i >= 0; --i)
{
AdjustDown(a,i,n);
}
}
void HeapSort(int a[], int n)
{
int i, temp;
BuildMaxHeap(a,n);
for(i = n-1; i > 0; --i)
{
temp = a[0];
a[0] = a[i];
a[i] = temp;
AdjustDown(a,0,i);
}
}
//二路归并排序
int* b = new int[20];
void Merge(int a[], int low, int heigh, int mid)
{
int i, j, k;
for(k = low; k <= heigh; ++k)
{
b[k] = a[k];
}
for(i = low,j = mid+1,k = i; i <= mid && j <= heigh; ++k)
{
if(b[i] <= b[j])
{
a[k] = b[i++];
}
else
{
a[k] = b[j++];
}
}
while(i <= mid)
{
a[k++] = b[i++];
}
while(j <= heigh)
{
a[k++] = b[j++];
}
}
void MergeSort(int a[], int low, int heigh)
{
if(low < heigh)
{
int mid = (low + heigh) / 2;
MergeSort(a,low,mid);
MergeSort(a,mid+1,heigh);
Merge(a,low,heigh,mid);
}
}
//打印输出
void Print(int a[], int n)
{
for(int i=0; i