文章目录
一. 直接插入排序
- 基本思想:当插入第i(i>=1)个元素时,前面的array[0],array[1],…array[i-1]已经排好序,此时用array[i]的排序码值与array[i-1],array[i-2],…array[0]的排序码值进行比较,找到符合位置即将array[i]插入,原来位置上即以后的元素顺序挨个后移一位。
-
代码实现:
void InsertSort(int* arr, int n)
{
for(int i = 0;i<n-1;i++)
{
int end = i;
int tmp = arr[end+1];
while(end>=0)
{
if(tmp<arr[end])
{
arr[end+1] = arr[end];
end-=1;
}
else
break;
}
arr[end+1] = tmp;
}
}
希尔排序
void ShellSort(int* a, int n)
{
gap = n;
while(gap>1)
{
gap = gap/3+1;
for(int i = 0;i<n-gap;i++)
{
int end = i;
int tmp = a[end+gap];
while(end>=0)
{
if(tmp<a[end])
{
a[end+gap] = a[end];
end-=gap;
}
else
break;
}
a[end+gap] = tmp;
}
}
}
-
特性总结:希尔排序由于gap的取值有很多方法和组,导致没有一定规律去计算,因此目前为止众多大佬通过大量实验证明例如,Knuth认为在关键没平均次数和对象平均移动次数大约在N的1.25到1.6N的1.25范围内,因此暂时按这个算。
1.时间复杂度o(N^1.23)
2. 稳定性:不稳定
3. 空间复杂度:o(1)
总结:gap越大,预排越快,越不接近有序。
gap越小,预排越慢,此时越接近有序。
当gap==1是就是直接插入排序,结果就有序了。
小白理解插入和希尔排序。