数据结构——插入排序
2016-04-15 15:23
239 查看
插入排序的主要思想就是将未排序的元素插入到已排好序的元素中间,主要有两个操作:查找和移动。首先查找到当下元素将要插入的位置,然后将位置之后排好序的元素向后移动一个位置,然后将当下元素放在空出的位置。
直接插入排序:从第二个元素开始进行排序,从前面已排序的序列中找到插入的位置,然后移动空出位置将元素赋值。
void InsertSort(int a[],int n=1) //insert sort for a[1]~a
{
for(int i=2;i<=n;i++)
{
a[0]=a[i];
int j;
for(j=i-1;j>=1;j--)
{
if(a[j]<a[0])
{
a[j+1]=a[j];
}
else
{
break;
}
}
a[j+1]=a[0];
}
}
二路插入排序:主要是减小了移动次数,将第一个元素当作中间值,从第二个元素开始,将大于中间值的元素插入中间值之后的已排序列中,将小于中间值的元素插入中间值之前的已排序列中。(在查找过程应用折半查找可以减小查找次数)
void TwopathSort(int a[],int n=1)
{
int *b=new int[n+1];
int final,first;
final=first=1;
b[1]=a[1];
for(int i=2;i<=n;i++)
{
if(a[i]>a[1])
{
b[0]=a[i];
int j;
for(j=final;j>1;j--)
{
if(b[j]>b[0])
{
b[j+1]=b[j];
}
else
{
break;
}
}
b[j+1]=b[0];
final++;
}
else
{
int j;
b[0]=a[i];
for(j=first;j!=2;j==n?j=1:++j)
{
if(b[j]<=b[0])
{
b[j==1?n:j-1]=b[j];
}
else
{
break;
}
}
b[j==1?n:j-1]=b[0];
first=(first==1?n:first-1);
}
}
for(int i=first,j=1;j<=n;i==n?i=1:++i,j++)
{
a[j]=b[i];
}
}
折半插入排序:在查找元素插入位置的时候应用折半查找的方法,减少了查找的次数。
void BInsertSort(int a[],int n=1)
{
int i;
for(i=2;i<=n;i++)
{
a[0]=a[i];
int low=1,high=i-1;
while(low<=high)
{
int m=(low+high)/2;
if(a[0]>a[m])
{
high=m-1;
}
else
{
low=m+1;
}
}
int j;
for(j=i-1;j>=high+1;--j)
{
a[j+1]=a[j];
}
a[j+1]=a[0];
}
}
直接插入排序:从第二个元素开始进行排序,从前面已排序的序列中找到插入的位置,然后移动空出位置将元素赋值。
void InsertSort(int a[],int n=1) //insert sort for a[1]~a
{
for(int i=2;i<=n;i++)
{
a[0]=a[i];
int j;
for(j=i-1;j>=1;j--)
{
if(a[j]<a[0])
{
a[j+1]=a[j];
}
else
{
break;
}
}
a[j+1]=a[0];
}
}
二路插入排序:主要是减小了移动次数,将第一个元素当作中间值,从第二个元素开始,将大于中间值的元素插入中间值之后的已排序列中,将小于中间值的元素插入中间值之前的已排序列中。(在查找过程应用折半查找可以减小查找次数)
void TwopathSort(int a[],int n=1)
{
int *b=new int[n+1];
int final,first;
final=first=1;
b[1]=a[1];
for(int i=2;i<=n;i++)
{
if(a[i]>a[1])
{
b[0]=a[i];
int j;
for(j=final;j>1;j--)
{
if(b[j]>b[0])
{
b[j+1]=b[j];
}
else
{
break;
}
}
b[j+1]=b[0];
final++;
}
else
{
int j;
b[0]=a[i];
for(j=first;j!=2;j==n?j=1:++j)
{
if(b[j]<=b[0])
{
b[j==1?n:j-1]=b[j];
}
else
{
break;
}
}
b[j==1?n:j-1]=b[0];
first=(first==1?n:first-1);
}
}
for(int i=first,j=1;j<=n;i==n?i=1:++i,j++)
{
a[j]=b[i];
}
}
折半插入排序:在查找元素插入位置的时候应用折半查找的方法,减少了查找的次数。
void BInsertSort(int a[],int n=1)
{
int i;
for(i=2;i<=n;i++)
{
a[0]=a[i];
int low=1,high=i-1;
while(low<=high)
{
int m=(low+high)/2;
if(a[0]>a[m])
{
high=m-1;
}
else
{
low=m+1;
}
}
int j;
for(j=i-1;j>=high+1;--j)
{
a[j+1]=a[j];
}
a[j+1]=a[0];
}
}