插入排序,希尔排序

    从刚开始本科学习数据结构的时候,对希尔排序就一直稀里糊涂的,弄不清到底怎么回事
,重温知识,对此才稍加了解,希尔排序就是插入排序,不过它对插入排序进行了一些优化,我们
之道,插入排序的性能与初始序列的排序状况有关,假设需要的排序效果是从小到达,如果给定的
序列原本就是有序的,那么排序的时候只需遍历一遍数组就可以了;但是,如果给定的序列原本是
逆序的,必须 5 4 3 2 1,那么对数组的中的数据(注意,这里是数据,而非数组)扫描的次数
大约是(5+4+3+2+1)次,也就是说如果给定n个数据,排序的时间复杂度是O(n^2),所以,插入
排序对于具有“良好有序性”的序列(也就是说序列不是逆序的)来说,其排序效果还是不错的;
但是对于纯逆序的序列来说,排序效果就不是那么好了,这时候,希尔排序的优化效果就体现出来了,
它的思想是这样的:先对局部序列进行数次插入排序,这样可以使整体序列趋于有序,最后对整体
序列进行插入排序,就可以得到有序的序列。
              时间复杂度         空间复杂度
插入排序         O(N^2)             O(1)
希尔排序    O(N^1.3)~O(N^2)         O(1)
#include<stdio.h>

void insert(int arr[], int n)
{
    for (int i = 1; i < n; i++) //2~N依次插入
    {
        //查找插入位置
        int pos = -1;
        for (int j = i - 1; j >= 0 ; j--) //依次遍历每一个数
        {
            if (arr[j] > arr[i])
            {
                pos = j;
            }
        }

        if (pos >= 0)
        {
            //进行后移
            int key = arr[i];
            for (int k = i - 1; k >= pos; k--)
                arr[k + 1] = arr[k];

            arr[pos] = key;
        }

    }
}

void ShellSort(int arr[], int n)
{
    for (int step = 5; step >= 1; step -= 2)
    {
        for (int i = step; i < n; i = i+step) //2~N依次插入0+step~n
        {
            //查找插入位置
            int pos = -1;
            for (int j = i - step; j >= 0; j -= step) //依次遍历每一个数
            {
                if (arr[j] > arr[i])
                {
                    pos = j;
                }
            }

            if (pos >= 0)
            {
                //进行后移
                int key = arr[i];
                for (int k = i - step; k >= pos; k-=step)
                    arr[k + step] = arr[k];
                arr[pos] = key;
            }

        }
    }

}




int main()
{
    int arr[] = { 7, 61, 41, 8, 9, 3, 2 };

    int length = sizeof(arr) / sizeof(arr[0]);

    ShellSort(arr, length);

    for (int i = 0; i < length; i++)
        printf("%5d", arr[i]);

    printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值