直接插入排序和希尔排序

来源:互联网 发布:过墙软件 编辑:程序博客网 时间:2024/04/30 02:46

直接插入排序是先将第一个数当做有序区,然后对之后的数进行排序依次将它们放入有序区
这里写图片描述

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)之间的

原创粉丝点击