#include<iostream>
#include<vector>
using namespace std;
void print(int a[],int n);
void InsertSort(int a[],int n)
{
for(int i=1;i<n;++i)
{
int tmp=a[i];
int j=i-1;
while(j>=0 && a[j]>tmp)
{
a[j+1]=a[j];
--j;
}
a[j+1]=tmp;
}
}
void BinInsertSort(int a[],int n)
{
int high;
int low;
int mid;
for(int i=1;i<n;++i)
{
int tmp=a[i];
high=i-1;
low=0;
while(low<=high)
{
mid=(low+high)/2;
if(tmp<=a[mid])
high=mid-1;
else
low=mid+1;
}
for(int j=i-1;j>=low;j--)
a[j+1]=a[j];
a[low]=tmp;
}
}
void ShellSort(int a[],int n)
{
int d=n/2;
while(d>0)
{
for(int i=0;i<d;++i)
{
for(int j=i+1;j<n;j=j+d)
{
//分成d组,组内使用插入排序
int tmp=a[j];
int k=j-1;
while(k>=i && a[k]>tmp)
{
a[k+1]=a[k];
--k;
}
a[k+1]=tmp;
}
}
d=d/2;
}
}
void SelectSort(int a[],int n)
{
for(int i=0;i<n-1;++i)
{
bool change=false;
int min=i;
for(int j=n-1;j>i;--j)
{
if(a[j]<a[min])
{
change=true;
min=j;
}
}
if(min!=i)
{
int tmp=a[i];
a[i]=a[min];
a[min]=tmp;
}
if(!change)
{
//本次没有交换,已经排好序
return;
}
}
}
void BubbleSort(int a[],int n)
{
for(int i=0;i<n;++i)
{
bool change=false;
for(int j=n-1;j>i;--j)
{
if(a[j-1]>a[j])
{
int tmp=a[j];
a[j]=a[j-1];
a[j-1]=tmp;
change=true;
}
}
if(!change)
return ;
}
}
void CocktailSort(int a[],int n)
{
int tail=n-1;
for(int i=0;i<=tail;++i)
{
bool change=false;
for(int j=tail;j>i;--j)
{
if(a[j-1]>a[j])
{
int tmp=a[j];
a[j]=a[j-1];
a[j-1]=tmp;
change=true;
}
}
if(!change)
return;
++i;
for(int j=i;j<tail;++j)
{
if(a[j]>a[j+1])
{
int tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
change=true;
}
}
if(!change)
return;
--tail;
}
}
int Partion(int a[],int p,int r)
{
//p为划分的起始位置,r为划分的结束位置,以a[r]为基准元
int i=p-1;//p-i为小于基准区间
for(int j=p;j<r;++j)
{
if(a[j]<a[r])
{
++i;
if(i!=j)
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
}
++i;
int tmp=a[i];
a[i]=a[r];
a[r]=tmp;
return i;
}
void QuickSOrt(int a[],int p,int r)
{
if(p<r)
{
int q=Partion(a,p,r);
QuickSOrt(a,p,q-1);
QuickSOrt(a,q+1,r);
}
}
void QuickSort(int a[],int n)
{
QuickSOrt(a,0,n-1);
}
int getRightChild(const int i)
{
return 2*(i+1);
}
int getLeftChild(const int i)
{
return 2*(i+1)-1;
}
void HeapAdjust(int a[],int n,int root)
{
int max=root;
int lcvalue=getLeftChild(root);
if(lcvalue<n && a[lcvalue]>a[root])
{
max=lcvalue;
}
int rcvalue=getRightChild(root);
if(rcvalue<n && a[rcvalue]>a[max])
{
max=rcvalue;
}
if(max!=root)
{
int tmp=a[root];
a[root]=a[max];
a[max]=tmp;
HeapAdjust(a,n,max);
}
}
void BuildHeap(int a[],int n)
{
for(int i=n/2-1;i>=0;--i)
HeapAdjust(a,n,i);
}
void HeapSort(int a[],int n)
{
BuildHeap(a,n);
// print(a,n);
int j=n;
while(j>0)
{
int tmp=a[0];
a[0]=a[j-1];
a[j-1]=tmp;
--j;
HeapAdjust(a,j,0);
}
}
void MergeArrange(int a[],int first,int mid,int last,int tmp[])
{
int i=first;
int j=mid+1;
int k=first;
while(i<=mid && j<=last)
{
if(a[i]<a[j])
tmp[k++]=a[i++];
else
tmp[k++]=a[j++];
}
while(i<=mid)
tmp[k++]=a[i++];
while(j<=last)
tmp[k++]=a[j++];
for(int ii=first;ii<=last;++ii)
a[ii]=tmp[ii];
}
void MergeSort(int a[],int first,int last,int tmp[])
{
if(first<last)
{
int mid=(first+last)/2;
MergeSort(a,first,mid,tmp);
MergeSort(a,mid+1,last,tmp);
MergeArrange(a,first,mid,last,tmp);
}
}
void MergeSort(int a[],int n)
{
int *tmp=new int[n];
MergeSort(a,0,n-1,tmp);
delete[] tmp;
}
void print(int a[],int n)
{
for(int i=0;i<n;++i)
cout<<a[i]<<' ';
cout<<endl;
}
int main()
{
const int n=10;
int a[n]={9,12,17,30,50,20,60,65,4,49};
//InsertSort(a,n);
//BinInsertSort(a,n);
//ShellSort(a,n);
//SelectSort(a,n);
//BubbleSort(a,n);
//CocktailSort(a,n);
//QuickSort(a,n);
//HeapSort(a,n);
MergeSort(a,n);
print(a,n);
return 0;
}
插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序
最新推荐文章于 2020-10-18 16:03:02 发布