插入排序
基本思想:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。
void InsertSort(vector<int>&v)
{
for (int i = 1; i < v.size(); i++)
{
int k = v[i];
int j;
for ( j = i - 1; j >= 0; j--)
{
if (k < v[j])
v[j + 1] = v[j];
else
break;
}
v[j + 1] = k;
}
}
特性总结:
- 元素集合越接近有序,直接插入排序算法的时间效率越高。
- 平均时间复杂度:O(N^2)。
- 空间复杂度:O(1)。
- 稳定性:稳定。
希尔排序
基本思想:
把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
void ShellSort(vector<int>&v)
{
int gap = v.size();
while (1)
{
gap = (gap / 3) + 1;
for (int i = gap; i < v.size(); i++)
{
int k = v[i];
int j;
for (j = i - gap; j >= 0; j = j - gap)
{
if (k < v[j])
v[j + gap] = v[j];
else
break;
}
v[j + gap] = k;
}
if (gap == 1)
{
break;
}
}
}
特性总结:
- 希尔排序是对插入排序的优化。
- 当 gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。整体而言,可以达到优化的效果。
- 时间复杂度:O(N ^ 1.3 ~ N ^ 2)。
- 稳定性:不稳定
来源:CSDN
作者:Cassie~
链接:https://blog.csdn.net/qq_43239560/article/details/104746506