插入排序的基本思想:
每次将一个待排序的数据对象按关键码大小插入一个有序的数据序列中,得到一个新的容量加1的数据序列,如此往复直到全部对象插入完毕
不同的插入排序算法寻找插入位置的方法不同,这是区别各种插入算法的根本
1>直接插入排序(稳定排序O(n^n))
基本思想:数据对象存储在顺序表中 ,当插入第i个对象V[i]时,前面的i-1个元素V[0],V[1],...V[i-1]已经排好序,用第i个对象的关键码同已经存在的i-1个对象的关键码从后往前顺序进行比较,找到合适的位置以后就将V[i]插入,而插入点以后的元素都随其向后移动一位
void insertsort()
{
int insertNum;
int j;
for(int i=1;i<len;i++) //第1个元素下标为0,从第2个元素(下标为1)开始,依次进行插入
{
insertNum=s[i];
j=i;
while(j>0&&insertNum<s[j-1]) //下标为i的元素最多进行i次比较,首先与它前面的元素比较
{
s[j]=s[j-1]; //依次后移
j--; //继续与前面的元素比较
}
s[j]=insertNum;
}
}
2>二分插入排序(稳定排序O(n*logn)
同直接插入排序一样,每次是将一个数据对象插入已经排好序的顺序表中。二分插入排序是用折半查找法寻找V[i]的插入位置,然后插入这个对象
void binary_insert_sort()
{
int insertNum;
int middle;
int left;
int right;
for(int i=0;i<len;i++)
{
insertNum=list[i];
left=0;
right=i-1;
while(left<=right) //寻找插入位置,比左面的大,比右面的小
{
middle=(left+right)/2;
if(insertNum>list[middle]) left=middle+1;
else right=middle-1;
}
for(int j=i;j>left;j--) //插入位置后面的元素向后移动一位
list[j]=list[j-1];
list[left]=insertNum;
}
}
未完待续。。。。
3>希尔排序(不稳定排序)
希尔排序又称缩小增量排序,将相隔为gap的元素分为一组,对各组分别进行直接插入排序,局部排序完成后缩小间隔gap,重复上述步骤,直至取gap=1,完成最后一次插入排序。开始时,间隔gap较大,因而各组中数据元素的个数较小,最少在刚开始的时候,算法是非常快的。随着算法的进行,间隔gap的取值变得越来越小,子序列中元素的个数越来越多,所以排序工作可能会变慢,但由于前面已经完成了部分排序工作,因而在很大程度上,减轻了后期的工作量,致使最终整体的排序速度还是比较快的。
需要说明的是,间隔gap的取法可能有很多种
void shell_sort()
{
int insertNum;
int gap=len/2;
while(gap)
{
for(int i=gap;i<len;i++)
{
insertNum=list[i];
int j=i;
while(j>=gap&&insertNum<list[j-gap])
{
list[j]=list[j-gap];
j-=gap;
}
list[j]=insertNum;
}
gap/=2;
}
}