文章目录
- 一. 直接插入排序
- 代码实现:
- 过程思想:
- 性能分析:
- 希尔排序
- 基本思想:
- 代码实现:
- 特性总结:希尔排序由于gap的取值有很多方法和组,导致没有一定规律去计算,因此目前为止众多大佬通过大量实验证明例如,Knuth认为在关键没平均次数和对象平均移动次数大约在N的1.25到1.6N的1.25范围内,因此暂时按这个算。
一. 直接插入排序
- 基本思想:当插入第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;
}
}
-
过程思想:
-
-
性能分析:
-
元素集合越接近有序,直接插入排序算法的时间效练就越高
-
时间复杂度:o(N^2)
-
空间复杂度:o(1)
-
稳定性: 稳定
希尔排序
-
基本思想:
- 选定小于n的值为gap进行分组,进行预排序,当gap==1时,数组已经接近有序了,所以现在用直接插入就会很快。
-
代码实现:
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是就是直接插入排序,结果就有序了。
小白理解插入和希尔排序。