shell排序(C++实例)

2023-11-11

交换排序由于比较相邻元素,因此平均时间代码为Θ(n2)。

shell排序也称为缩小增量排序。利用插入排序的最佳时间特性,将待排序序列分成若干子序列,然后分别对子序列排序,最后将子序列组合起来。

如下图所示:


算法的实现:

#include "stdio.h"

const int gi_incre = 2;

template< class Elem >
int inssort2( Elem list[], int n, int incre )
{
    int i, j;
    Elem elem_tmp;
    for ( i = incre; i < n; i += incre )
    {
        for ( j = i; ( j >= incre ) && ( list[j] < list[j - incre] ); j -= incre )
        {
            // swap Elem[j] and Elem[j - incre]
            elem_tmp = list[j];
            list[j] = list[j - incre];
            list[j - incre] = elem_tmp;
        }
    }
    return 0;
}   
    
    
template< class Elem >
int shellsort( Elem list[], int n )
{
    int i, j;
    for ( i = n/gi_incre; i > gi_incre; i /= gi_incre )
    {
        printf( "i: %d\n", i );
        for ( j = 0; j < i; j++ )
        {
            inssort2< Elem >( &list[j], n - j, i );
        }
    }
    inssort2< Elem >( list, n, 1 );
    return 0;
}

int main()
{
    int p_srcarr[] = {59, 20, 17, 13, 28, 14, 23, 83, 36, 98, 11, 70, 65, 41, 42, 15};
    const int i_len = 16;

    printf( "%s", "before shellsort\n" );
    int i_index = 0;
    for( i_index = 0; i_index < i_len; i_index ++ )
    {
        printf( "%4d", p_srcarr[i_index] );
    }
    printf( "%s", "\n" );

    shellsort( p_srcarr, i_len );

    printf( "%s", "after shellsort\n" );
    for( i_index = 0; i_index < i_len; i_index ++ )
    {
        printf( "%4d", p_srcarr[i_index] );
    }
    printf( "%s", "\n" );
    return 0;
}

结果输出:

before shellsort
  59  20  17  13  28  14  23  83  36  98  11  70  65  41  42  15
i: 8
i: 4
after shellsort
  11  13  14  15  17  20  23  28  36  41  42  59  65  70  83  98

不对增量为gi_incre(本例中为2)的情况再进行一次排序?

个人理解,是因为插入排序的最好时间代价为θ(n),对于基本有序的数据采用插入排序的效率很高。

选择适当的增量序列,可以使用shell排序比其它排序更有效。

一般来说,增量每次除以2时,并没有多大效果。增量每次除以3时,效果最好。

分析shell的时间代价是很困难的,因此必须不加证明地承认,增量每次除以3时,shell排序的平均运行时间为Θ(n1.5)。


参考:

《数据结构与算法分析》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell排序(C++实例) 的相关文章

随机推荐

  • 100天精通Python(爬虫篇)——第43天:爬虫入门知识大总结

    文章目录 一 爬虫概述 1 为什么要学习爬虫 2 爬虫与Python 3 爬虫合法吗 4 爬虫的矛与盾 5 爬虫原理图 and 流程图 二 相关技术介绍 1 HTML 与 CSS 2 URL网址解释 3 HTTP 与 HTT S 1 常见请
  • Knights of the Round Table【点双连通分量与二分图】

    题目链接 POJ 2942 题意 亚瑟王要给骑士们开会啦 有N个骑士 其中有M对骑士相互之间会吵架 亚瑟王不允许相互吵架的骑士坐在一起 但是他们可以一同坐在餐桌上 只要隔开就可以了 还有就是 出席会议的骑士数必须是奇数 这是为了让投票表决议
  • 海伯利安:开放地图生态的未来与机遇

    本文选自海伯利安CTO邹光先大会演讲 全文如下 前两天有朋友问了我一个问题 他说谷歌地图在全世界覆盖那么广 用户量也非常大 用户体验也很好 在地图这个赛道上 海伯利安的创新和机会在哪里 这是个好问题 值得反复思考 深入思考 结合我们对地图行
  • Maven的配置、安装及测试可用

    1 配置环境变量的话 配置用户变量和系统变量也没差 反正电脑都是一个人使用 先配置M2 HOME 配置MAVEN HOME也可以 我放置Maven的路径是D Program Files x86 apache maven 3 2 2 具体要看
  • 程序的几种结构

    目录 顺序结构 选择结构 循环结构 break和continue的区别 顺序结构 选择结构 表达式 单选结构 if boolean表达式 执行语句 表达式为true执行相应的语句 否则不执行 双选结构 if boolean表达式 执行语句1
  • 小程序语音识别用户体验优化

    文章由来 这里通过简单的对话形式来描述接下来要讲的bug 相关界面在文章中都有展示 可以结合相关图片更好的理解问题 测试小伙伴 界面一直停留在 语音识别中 我 都到识别这一步了 应该是测试环境下后台不稳定吧 你再多试几次 测试小伙伴 我去问
  • 爬虫的操作

    目录 爬虫基本 re etree beautifulsoup 保存本地 连接数据库 基本 re lxml etree beautifulsoup 保存到本地 传入数据库 大致分为 爬虫基本 re etree beautifulsoup 保存
  • 分布式思维

    说在前面的话 Java编程里有两座大山 高可用 高并发 而分布式无疑是翻越这两座大山最好的方式 本篇文章讲的是分布式思维 目的是为了帮助大家在学习分布式之前对某些分布式领域里的一些概念做了解 在脑海里对分布式有个整体的认识 不会针对某一项技
  • 卷积神经网络中的 “全连接层”

    文章目录 一 什么是 全连接层 二 详解 一 什么是 全连接层 对 n 1 层和 n 层而言 n 1 层的任意一个节点 都和第 n 层所有节点有连接 即第n层节点都和第n 1层节点相连接 即第n层的每个节点在进行计算的时候 激活函数的输入是
  • django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but setting

    django core exceptions ImproperlyConfigured Requested setting DEFAULT INDEX TABLESPACE but settings are not configured Y
  • JSP+Servlet+JavaBean

    JSP相当于在HTML页面中加上Java代码 一般在标签中放入主要代码 在JSP里用把Java代码包含起来的 Servlet的生命周期 被服务器实例化后 容器运行init方法 当请求 Request 到达时 运行service方法 serv
  • 扩散模型实战(二):扩散模型的发展

    推荐阅读列表 扩散模型实战 一 基本原理介绍 扩散模型从最初的简单图像生成模型 逐步发展到替代原有的图像生成模型 直到如今开启 AI 作画的时代 发展速度可谓惊人 下面介绍一下2D图像生成相关的扩散模型的发展历程 具体如下 开始扩散 基础扩
  • 一个B类地址,它的子网掩码为255.255.224.0,能划分多少个子网

    From http hi baidu com hzmdesky blog item ec97fc1bc9ce8f148718bf57 html cmtid ce50e26e27e192d481cb4ade 一个B类地址 它的子网掩码为255
  • 学习笔记-Matlab算法篇-图像处理

    图像处理 01图像基本处理 Matlab读取图片 gt gt mat imread pic1 png gt gt imshow mat gt gt size mat ans 906 947 3 图像转换函数 gray2ind intensi
  • 您也使用托管C++吗?

    转向 NET后 手头上往往仍有旧的模块要重用 也许这些模块是Delphi写的 也许是C C 写的 或者是其它编程语言 为了能把它们移植到 NET下 或者是在 NET中调用 To be or not to be that is a quest
  • 再次分析-提出 Spring AOP-真正的AOP

    前言 本篇的Spring AOP系类文章第三篇因为我们前面采用原始的方式实现了一次所有本篇我们来详细Spring AOP的的全面使用 个人主页 尘觉主页 个人简介 大家好 我是尘觉 希望我的文章可以帮助到大家 您的满意是我的动力 在csdn
  • 机器学习实战:逻辑回归(3)-Sklearn实现病马死亡率预测

    from sklearn linear model import LogisticRegression 函数说明 使用Sklearn构建Logistic回归分类器 Parameters 无 Returns 无 def colicSklear
  • JMeter压测数据实时监控

    目录 1 1 Influxdb关键特性 1 2 Influxdb安装 windows 2 Chronograf 2 1 Chronograf特性 2 2 Chronograf安装 windows 3 Grafana 3 1 Grafana特
  • 数学建模及其算法概述

    一 数学模型的分类 1 按模型的数学方法分 几何模型 图论模型 微分方程模型 概率模型 最优控制模型 规划论模型 马氏链模型等 2 按模型的特征分 静态模型和动态模型 确定性模型和随机模型 离散模型和连续性模型 线性模型和非线性模型等 3
  • shell排序(C++实例)

    交换排序由于比较相邻元素 因此平均时间代码为 n2 shell排序也称为缩小增量排序 利用插入排序的最佳时间特性 将待排序序列分成若干子序列 然后分别对子序列排序 最后将子序列组合起来 如下图所示 算法的实现 include stdio h