插入排序是从将待排列的数组分成两列,待排列的无序区和排列好的有序区;
思想就是每次从无序区取出第一个数据插入到有序区的正确位置。
时间复杂度是n~n^2,平均是n^2,档大部分数据有序的时候,插入排序的速度会大大提升。
是稳定的排序算法。
void incert_sort(vector<int> input, int n)
{
for (int i = 1; i < n; i++)
{
int tmp = input[i];
int j = i-1;
while (j>=0 && input[j] < tmp)
{
input[j + 1] = input[j];
j--;
}
input[j + 1] = tmp;
}
}
希尔排序是插入排序的变种,通过改变步长,不断的实行步长下的简单插入排序。因为存在不相邻的元素交换,所以可能是不稳定的。
平均时间复杂度是nlogn,最坏是nlogn,因为与步长的选取有关,所以没有最优。
void shell_sort(vector<int> input, int n)
{
int d = n / 2;
while (d>0)
{
for (int i = d; i < n; i++)
{
int j = i - d;
int tmp = input[i];
while (j >= 0 && input[j]>tmp)
{
input[j + d] = input[j];
j = j - d;
}
input[j + d] = tmp;
}
}
}