希尔排序(直接插入排序优化)

基本思想

  • 根据步长给序列分组,每组又通过直接插入排序算法进行排序,然后通过不断缩短步长,直接插入排序算法进行排序,直至步长为1,则序列排序完成。

直接插入与希尔排序适用情况

在这里插入图片描述

思路分析

  1. 选定步长gap,将 gap 位定为 i,则 i 与 i - gap位为一组序列
    在这里插入图片描述
  2. 通过直接插入排序将该序列进行排序,排序成功后,i 往后移动一位,直至 i = len,则第一趟排序成功
  3. 重复1、2,当gap = 1,整个序列排序成功

代码实现(c语言)

//非递减排序
void Shell_Insert_Sort(DataType arr[], int len)
{
    int gap;    //步长(间隔)
    int i, j, temp;

    for (gap = len >> 1; gap > 0; gap >>= 1)  
    {
        for (i = gap; i < len; i++)
        {
            temp = arr[i];
            //非递减排序
            //若为递减排序,则修改为arr[j] < temp
            for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)   
            {
                arr[j + gap] = arr[j];  //数据大的往后移动
            }
            arr[j + gap] = temp;    //temp放在合适的位置
        }
    }
}

性能分析

在这里插入图片描述

代码测试(c语言)

#include <stdio.h>

typedef char DataType;

void Shell_Insert_Sort(DataType arr[], int len)
{
    int gap;    //步长(间隔)
    int i, j, temp;

    for (gap = len >> 1; gap > 0; gap >>= 1)  
    {
        for (i = gap; i < len; i++)
        {
            temp = arr[i];
            //非递减排序
            //若为递减排序,则修改为arr[j] < temp
            for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)   
            {
                arr[j + gap] = arr[j];  //数据大的往后移动
            }
            arr[j + gap] = temp;    //temp放在合适的位置
        }
    }
}

int main()
{
	//关键字序列
    DataType arr[] = { 'c','a','d','b','f','s',
    			  	   'h','u','q','w','e','r', 
    			       't','y','i','o','p','g',
    			       'j','k','l','z','x','v',
    			       'n','m'};
	//序列长度
    int len = sizeof(arr) / sizeof(DataType);
    //希尔排序
    Shell_Insert_Sort(arr, len);
    //遍历序列
    for (int i = 0; i < len; i++)
    {
        printf("%c\n", arr[i]);
    }

	return 0;
}

资料参考

  1. 希尔排序
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值