一、直接插入排序
1、思想
从第二个元素开始,从后往前扫描,如果比它大,向后移,找到第一个小于或者等于 它的数插在它后面
2、代码
void InsertSort(int* arr,int len)
{
int i;
int j;
int tmp;
for(i = 1;i < len; i++)
{
tmp = arr[i];
for(j = i-1;j >= 0;j--)
{
if(arr[j] <= tmp)
{
break;
}
else
{
arr[j+1] = arr[j];
}
}
arr[j+1] = tmp;
}
}
3、插入排序是稳定的
4、时间复杂度为O(n^2)
5、空间复杂度为O(1)
特别得,当待排序的数据已经完全有序时,事件复杂度为O(n),
特点:越有序越快
二、希尔排序
1、思想
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
2、代码
void Shell(int* arr,int len,int gap) //一趟Shell的过程
{
int i;
int j ;
int tmp;
for(i = gap;i < len;i ++)
{
tmp = arr[i];
for(j = i-gap; j >= 0;j -=gap)
{
if(arr[j] <= tmp)
{
break;
}
else
{
arr[j+gap] = arr[j];
}
}
arr[j+gap] = tmp;
}
}
void ShellSort(int* arr,int len)
{
int d[] = {3,1};
for(int i = 0;i<sizeof(d)/sizeof(d[0]);i++)
{
Shell(arr,len,d[i]);
}
}
在增量序列中值应当是相互之间互素,并且最后一个增量值必须为1
3、希尔排序是不稳定的
4、时间复杂度,取决于所取“增量序列”的函数,大概 O(n^1.3)~O(n ^1.5)
5、空间复杂度 O(1)