#include <iostream>
using namespace std;
//测试的数组
int a[]={13,2,3,5,67,2,10,7,11,20,45,32,1,6,9,4,21,30,14,8};
int b[]={4,2,1};
/*打印数组*/
void ArrayPrint(int array[],int size)
{
int i;
for(i=0;i<size;i++)
cout<<array[i]<<" ";
cout<<endl;
}
/*简单选择排序*/
void SelectSort(int array[],int size)
{
int i,j,k;
int temp;
for(i=0;i<size-1;i++)
{
k=i;
for(j=i+1;j<size;j++)
{
if(array[j]<array[k])
k=j;
}
if(k!=i)
{
temp=array[i];
array[i]=array[k];
array[k]=temp;
}
}
}
/*直接插入排序*/
void InsertSort(int array[],int size)
{
int i,j,k;
for(i=0;i<size-1;i++)
{
j=i;
k=array[j+1];
while(j>=0&&k<array[j])
{
array[j+1]=array[j];
j--;
}
array[j+1]=k;
}
}
/*冒泡排序*/
void BubbleSort(int array[],int size)
{
int i,j;
int temp;
for(i=0;i<size-1;i++)
{
for(j=0;j<size-i-1;j++)
{
if(array[j]>array[j+1])
{
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
}
/*快速排序*/
int Partition(int array[],int low,int high)
{
int i,j,k;
i=low;
j=high;
k=array[low];
while(i<j)
{
while(i<j&&array[j]>k)
j--;
if(i<j)
array[i++]=array[j];
while(i<j&&array[i]<k)
i++;
if(i<j)
array[j--]=array[i];
}
array[i]=k;
return i;
}
void QuickSort(int array[],int low,int high)
{
int part;
if(low<high)
{
part=Partition(array,low,high);
QuickSort(array,low,part-1);
QuickSort(array,part+1,high);
}
}
/*希尔排序*/
void ShellInsert(int array[],int size,int step)
{
int i,j,k;
for(i=0;i<size;i++)
{
j=i-step;
k=array[j+step];
while(j>=0&&k<array[j])
{
a[j+step]=a[j];
j-=step;
}
a[j+step]=k;
}
}
void ShellSort(int array[],int size,int steparray[],int stepsize)
{
int i;
for(i=0;i<stepsize;i++)
ShellInsert(array,size,steparray[i]);
}
/*堆排序*/
void MaxHeapify(int array[],int size,int index)
{
int left,right;
int largest;
int temp;
left=index*2+1;
right=index*2+2;
largest=index;
if(left<=size-1&&array[left]>array[index])
largest=left;
if(right<=size-1&&array[right]>array[largest])
largest=right;
if(largest!=index)
{
temp=a[index];
a[index]=a[largest];
a[largest]=temp;
MaxHeapify(array,size,largest);
}
}
void BuildMaxHeap(int array[],int size)
{
int i;
for(i=size/2-1;i>=0;i--)
MaxHeapify(array,size,i);
}
void HeapSort(int array[],int size)
{
int temp;
BuildMaxHeap(array,size);
temp=a[0];
a[0]=a[size-1];
a[size-1]=temp;
while(--size>1)
{
MaxHeapify(array,size,0);
temp=a[0];
a[0]=a[size-1];
a[size-1]=temp;
}
}
/*二路归并排序*/
void Merge(int a[],int size_a,int b[],int size_b)
{
int i,j,k;
int *c=NULL;
i=j=k=0;
c=(int *)malloc((size_a+size_b)*sizeof(int));
while(i<size_a&&j<size_b)
{
if(a[i]<=b[j])
c[k++]=a[i++];
else
c[k++]=b[j++];
}
while(i<size_a)
c[k++]=a[i++];
while(j<size_b)
c[k++]=b[j++];
for(i=0;i<size_a+size_b;i++)
a[i]=c[i];
free(c);
}
void MergeSort(int a[],int low,int high)
{
int mid;
if(low<high)
{
mid=(low+high)/2;
MergeSort(a,low,mid);
MergeSort(a,mid+1,high);
Merge(&a[low],mid-low+1,&a[mid+1],high-mid-1+1);
}
}
int main(int argc,char **argv)
{
ArrayPrint(a,20);
//SelectSort(a,20);
//InsertSort(a,20);
//BubbleSort(a,20);
//QuickSort(a,0,19);
//ShellSort(a,20,b,3);
//HeapSort(a,20);
//MergeSort(a,0,19);
ArrayPrint(a,20);
return 0;
}