直接插入排序是先将第一个数当做有序区,然后对之后的数进行排序依次将它们放入有序区
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 (arr[end] > tmp)
{
arr[end + 1] = arr[end];
--end;
}
else
{
break;
}
}
arr[end + 1] = tmp;
}
}
希尔排序是对直接插入排序的优化,因为如果是逆序的,直接插入排序的效率太低,它的时间复杂度一定是O(N2)
希尔排序就是一种对直接排序进行优化的有效措施,但是如果是有序的,希尔排序反而具有反作用
希尔排序也可以认为是一种分组排序
其实这几组是并行执行的,gap的值越大,小的数会尽快往前排序,但是也是越不接近有序的
void ShellSort(int *arr,size_t n)
{
int gap = n ;
while (gap >1)
{
gap = gap / 3 + 1;
for (size_t i = 0; i< n - gap; ++i)
{
int end = i;
int tmp = arr[end + gap];
for (; end >= 0; end -= gap)
{
if (arr[end] > tmp)
{
arr[end + gap] = arr[end];
}
else
{
break;
}
}
arr[end + gap] = tmp;
}
}
}
当gap变成1的时候也就变成了直接插入排序。
希尔排序它的时间复杂度是介于O(N)~O(N2)之间的