#include<iostream>
#include<time.h>
using namespace std;
/*
简单插入排序:
最差时间复杂度:O(n^2)
平均时间复杂度:O(n^2)
*/
void Insertion_Sort(int *a,int n)
{
int i,j;
for(i=2;i<=n;i++)
if(a[i]<a[i-1])
{
a[0]=a[i];
for(j=i-1;a[j]>a[0];j--)
a[j+1]=a[j];
a[j+1]=a[0];
}
}
/*
折半插入排序:
最差时间复杂度:O(n^2)
平均时间复杂度:O(n^2)
*/
void Bin_Sort(int *a,int n)
{
int i,j,low,mid,high;
for(i=2;i<=n;i++)
if(a[i]<a[i-1])
{
a[0]=a[i];
low=1;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]>a[0])
high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>high;j--)
a[j+1]=a[j];
a[high+1]=a[0];
}
}
/*选择排序:
最差时间复杂度:O(n^2)
平均时间复杂度:O(n^2)
*/
void Selection_Sort(int *a,int n)
{
int i,j,k;
for(i=1;i<n;i++)
{
k=i;
for(j=i+1;j<=n;j++)
if(a[k]>a[j])
k=j;
if(k!=i)
swap(a[k],a[i]);
}
}
/*快速排序
最差时间复杂度:O(n^2)
平均时间复杂度:O(nlogn)
*/
void Quick_Sort(int *a,int low,int high)
{
int i=low,j=high;
a[0]=a[low];
while(low<high)
{
while(low<high && a[high]>=a[0])
high--;
swap(a[low],a[high]);
while(low<high && a[low]<=a[0])
low++;
swap(a[low],a[high]);
}
a[low]=a[0];
if(i!=low)
Quick_Sort(a,i,low-1);
if(j!=high)
Quick_Sort(a,high+1,j);
}
/*冒泡排序
最差时间复杂度:O(n^2)
平均时间复杂度:O(n^2)
*/
void Bubble_Sort(int *a,int n)
{
int i;
bool change=true;
while(change)
{
change=false;
for(i=1;i<n;i++)
if(a[i]>a[i+1])
{
change=true;
swap(a[i],a[i+1]);
}
}
}
/*鸡尾酒排序(双向冒泡排序):
最差时间复杂度:O(n^2))
平均时间复杂度:O(n^2)
*/
void Cocktail_Sort(int *a,int n)
{
int i;
int left=1,right=n;
bool change=true;
while(change)
{
change=false;
for(i=left;i<right;i++)
if(a[i]>a[i+1])
{
change=true;
swap(a[i],a[i+1]);
}
right--;
for(i=right;i>left;i--)
if(a[i]<a[i-1])
{
change=true;
swap(a[i],a[i-1]);
}
left++;
}
}
/*堆排序
最差时间复杂度:O(nlogn)
平均时间复杂度:O(nlogn)
*/
void Heap_Adjust(int *a,int low,int high)
{
int i;
a[0]=a[low];
for(i=2*low;i<=high;i*=2)
{
if(i<high && a[i]<a[i+1])
i++;
if(a[0]>=a[i])
break;
else
{
a[low]=a[i];
low=i;
}
a[low]=a[0];
}
}
void Heap_Sort(int *a,int n)
{
int i;
for(i=n/2;i>=1;i--)
Heap_Adjust(a,i,n);
for(i=n;i>=2;i--)
{
swap(a[1],a[i]);
Heap_Adjust(a,1,i-1);
}
}
/*
希尔排序
最差时间复杂度:O(n^2)
平均时间复杂度:O(n^1.3)
*/
void Shell_Sort(int *a,int n)
{
int i,j;
int gap=n/2;
while(gap)
{
for(i=gap+1;i<=n;i++)
if(a[i]<a[i-gap])
{
a[0]=a[i];
for(j=i-gap;j>0 && a[j]>a[0];j-=gap)
a[j+gap]=a[j];
a[j+gap]=a[0];
}
gap/=2;
}
}
/*
计数排序:
最差时间复杂度:O(n+k)
平均时间复杂度:O(n+k)
*/
void Counting_Sort(int *a,int n)
{
int i;
int max=a[1];
for(i=2;i<=n;i++)
{
if(max<a[i])
max=a[i];
}
int *mark=new int[max+1];
memset(mark,0,sizeof(int)*(max+1));
for(i=1;i<=n;i++)
mark[a[i]]++;
for(i=1;i<=max;i++)
mark[i]+=mark[i-1];
int *p=new int[n+1];
memset(p,0,sizeof(int)*(n+1));
for(i=1;i<=n;i++)
{
p[mark[a[i]]]=a[i];
mark[a[i]]--;
}
for(i=1;i<=n;i++)
a[i]=p[i];
}
/*
鸽巢排序:
最差时间复杂度:O(n+N)
平均时间复杂度:O(n+N)
*/
void Pigeonhole_Sort(int *a,int n)
{
int i,j,k=1;
int max=a[1];
for(i=2;i<=n;i++)
{
if(max<a[i])
max=a[i];
}
int *mark=new int[max+1];
memset(mark,0,sizeof(int)*(max+1));
for(i=1;i<=n;i++)
mark[a[i]]++;
for(i=1;i<=max;i++)
for(j=1;j<=mark[i];j++)
a[k++]=i;
}
/*
归并排序:
最差时间复杂度:O(nlogn)
平均时间复杂度:O(nlogn)
*/
void Merge(int *a,int low,int mid,int high)
{
int p,i=low,j=mid+1,k=low;
int *temp=new int[high+1];
memset(temp,0,sizeof(int)*(high+1));
for(;i<=mid && j<=high;k++)
if(a[i]<a[j])
temp[k]=a[i++];
else
temp[k]=a[j++];
if(i<=mid)
for(p=0;p<=mid-i;p++)
temp[k+p]=a[i+p];
if(j<=high)
for(p=0;p<=high-j;p++)
temp[k+p]=a[j+p];
for(p=low;p<=high;p++)
a[p]=temp[p];
}
void MSort(int *a,int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
MSort(a,low,mid);
MSort(a,mid+1,high);
Merge(a,low,mid,high);
}
}
/*
梳排序:
最差时间复杂度:O(nlogn)
平均时间复杂度:O(nlogn)
*/
void Comb_Sort(int *a,int n)
{
int i;
int gap=n;
while(gap/=1.3)
{
for(i=gap+1;i<=n;i++)
if(a[i]<a[i-gap])
swap(a[i],a[i-gap]);
}
}
/*
奇偶排序(砖排序):
最差时间复杂度:O(n^2)
平均时间复杂度:O(n^2)
*/
void Odd_Even(int *a,int n)
{
int i;
bool change=true;
while(change)
{
change=false;
for(i=1;i<n;i+=2)
if(a[i]>a[i+1])
{
change=true;
swap(a[i],a[i+1]);
}
for(i=2;i<n;i+=2)
if(a[i]>a[i+1])
{
change=true;
swap(a[i],a[i+1]);
}
}
}
/*
地精排序(侏儒排序):
最差时间复杂度:O(n^2)
平均时间复杂度:O(n^2)
*/
void Gnome_Sort(int *a,int n)
{
int i=0;
while(i<n)
{
if(i<=0 || (i>=1 && a[i]<=a[i+1]))
i++;
else
{
swap(a[i],a[i+1]);
i--;
}
}
}
void Out(int *a,int n)
{
int i;
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
int main()
{
srand((unsigned)time(NULL));
int *p=new int[16];
memset(p,0,sizeof(int)*16);
for(int i=1;i<=15;i++)
{
p[i]=rand()%100;
}
Out(p,15);
//Insertion_Sort(p,15);
//Bin_Sort(p,15);
//Selection_Sort(p,15);
//Quick_Sort(p,1,15);
//Bubble_Sort(p,15);
//Cocktail_Sort(p,15);
//Heap_Sort(p,15);
//Shell_Sort(p,15);
//Counting_Sort(p,15);
//Pigeonhole_Sort(p,15);
//Comb_Sort(p,15);
//Odd_Even(p,15);
//MSort(p,1,15);
Gnome_Sort(p,15);
Out(p,15);
}