【排序算法】详解直接插入排序和希尔排序原理及其性能分析

数据结构实验:内部排序算法的性能分析 文章目录前言一、问题描述二、问题分析三、实验结果及分析(1)实验数据描述(2)实验结果(3)性能分析四、源代码 前言 记录下本学期的数据结构实验 本实验主要集中于比较几种内部排序算法 提示:以下是本篇文章正文内容,下面案例可供参考 一、问题描述 设计一个程序,对各种内部排序算法的关键字比较次数和移动次数进行比较。具体要求如下: ⑴ 编程实现内部排序算法:编程实现直接插入排序,希尔排序,冒泡排序,快速排序,简单选择排序,堆排序,归并排序算法。 ⑵ 要求数据规模:待排序数据类型不限(整型或浮点型),读取.. 阅读详情

插入排序

算法原理

插入排序又或者说直接插入排序,是一种和冒泡排序类似的并且比较简单的排序方法,

基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。就像大家平时打扑克牌一样.

在这里插入图片描述
类似于摸牌然后将其按照顺序排列。每次摸到一张牌后,根据其点数从左到右插入到确切位置。

动图演示如下在这里插入图片描述

细节分析

用for循环控制,从最左侧的元素开始,用它右侧的元素进行依次比较(将这个右侧的元素设置为tmp),并挪动位置,最后将其插入合适的位置
在这里插入图片描述
在这里插入图片描述

注意:看似图中是在用黑色阴影这个元素在与其前面的做交换,其实并没有,真正原理应该是把黑色阴影里面的元素拿出来(赋值给了tmp),然后与前面的进行比较,有合适的即进行覆盖,但是由于黑色阴影的值已经拿了出来(也就是tmp里面的值),所以在比较之后便可以覆盖,不会丢失这个值

代码实现

int sortArray(int* nums, int numsSize)
{
    for(int i = 0;i<numsSize-1;i++)
    {
        int pointer = i;
        int tmp = nums[i+1];
        while(pointer>=0)
        {
            if(nums[pointer]>tmp)
            {
                nums[pointer+1] = nums[pointer];
                pointer--;
            }
            else
            {
                break;
            }
        }
        nums[pointer+1] = tmp;
    }
}

再配上一张代码细节的具体分析
在这里插入图片描述

复杂度分析:

时间复杂度

(1) 最好情况:序列已经是升序排列,在这种情况下,如果原序列本身就已经是排好了序的,那么每一趟排序只需要比较一次而不需要任何移动。此时一共需要 n-1 次比较,也就是O(N)
(2) 最坏情况:如果原序列本身就是逆序的,那么第 i(1 ≤ i ≤ n-1)趟排序需要比较 i 次、移动 i+2 次(包括将待排序元素移动到tmp变量中和从tmp变量中移动到最终位置上)。此时,一共需要1+2+3+…+(n-1) = n(n-1)/2,所以O(N^2)

空间复杂度

直接插入排序只需要一个额外的tmp变量,所以它的空间复杂度为O(1)

稳定性分析:

因为插入排序是只有当前元素比另外一个元素大的时候才会交换,所以相同元素的前后相对位置并不会改变,所以排序稳定

与冒泡排序的对比

若具体看冒泡排序,请看这篇文章–>冒泡排序文章戳此处
下图代表前面的元素全部有序,就最后两个无序
在这里插入图片描述

希尔排序

算法原理

希尔排序是希尔排序由唐纳德·希尔(Donald Shell)发明并于1959年公布,在直接插入排序算法的基础上进行改进而来的,从上面的直接插入排序我们可以看出,当原序列的长度很小时,即便它的所有元素都是无序的,此时进行的元素比较和移动的次数还是很少。所以希尔排序正是利用这点,它首先将待排序的原序列划分成很多小的序列,称为子序列。然后对这些子序列进行直接插入排序,因为每个子序列中的元素变少了,所以效率也提高了.

说简单就两点:1.先进行预排序2.直接插入排序


细节分析

具体步骤如图:

原始数组,我们设定颜色相同为一组
在这里插入图片描述
初始分gap组,gap = n / 2 = 5,也就是分了5组,[8,3][9,5][1,4][7,6][2,0]
在这里插入图片描述
五组分别进行插入排序,此时8,9,7这种大元素被排到前面,如下图,然后再缩小gap,分为2组,[3,1,0,9,7][5,6,8,4,2]
在这里插入图片描述
对以上两组再进行直接插入排序,结果如下,可以看出数组更加接近有序,再将gap除以2,也就是gap =1, 此时就变成了直接插入排序,此时整个数组为1组[0,2,1,4,3,5,7,6,9,8]
在这里插入图片描述
此时再进行微调,便达到了有序
在这里插入图片描述

由此可以看出,在前面gap不等于1时,前面几组调整都是预排序,而这种预排序完成之后就已经接近有序了,而上面在直接插入排序中我们也说到了,在顺序好的情况下,时间复杂度为O(N),而这里接近有序,时间复杂度也可以大概看作O(N),大大节省了时间,这也是希尔排序的主要作用和意义

代码实现

void sortArray(int* nums, int numsSize)
{
    int gap = 6;
    while(gap>1)
    {
        gap=gap/3+1; //上图是gap = gap/2;两者都行,但官方是更推荐gap=gap/3+1
        for(int i = 0;i<numsSize-gap;i++)
        {
        	int pointer = i;
        	int tmp = nums[i+gap];
        	while(pointer>=0)
        	{
            	if(nums[pointer]>tmp)
            	{
                	nums[pointer+gap] = nums[pointer];
                	pointer -= gap;
            	}
            	else
            	{
            	    break;
            	}
        	}
        	nums[pointer+gap] = tmp;
        	}
    	}
}

通过上面你能发现希尔排序的代码无非就是在直接插入排序的基础之上多了一个while循环来控制gap分组

复杂度分析

时间复杂度

希尔排序的时间复杂度分析十分困难,希尔排序的平均时间复杂度和执行它所选择的gap分组有关,这就要设计一些复杂的数学问题,在Knuth编著的《计算机程序设计技巧》第三卷中的大量分析得出,时间复杂度大概在O(n^(1.3)),即n的1.3次方。

空间复杂度

从我们以上的实现代码中可以看出,希尔排序只需要几个固定的额外存储空间,分别用于存储变量,这和它的待排序序列的大小无关。所以,它的空间复杂度为O(1)。

稳定性分析

由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定的。

总结对比

希尔排序和直接插入排序直接有着很强的关联性,希尔排序就是直接插入排序的加强版,利用预排序进行优化,提高排序的效率.
总的来说,直接插入排序适用于小规模或基本有序的元素,具有简单易懂的实现方法和稳定的排序性质;希尔排序适用于中大型规模的元素,通过预处理和分组插入排序的方式,提高了排序的效率。选择使用哪种算法取决于具体的需求和数据特征。

常见排序算法基本原理及实现(快排,归并,堆排,直接插入.....) 文章目录常见排序算法总览1.概念1.1 排序1.2 稳定性(重要)2.插入排序2.1直接插入排序-原理2.2代码实现2.3性能分析3.希尔排序3.1 原理3.堆排序3.1原理 常见排序算法总览 1.概念 1.1 排序 排序就是使待排序序列,按照其中的某个或某些关键字的大小(以什么作为比较基准),递增或递减的排列起来的操作。平时如果提到排序,通常指的是排升序(非降序)。通常意义上的排序,都是指的原地排序(in place sort)。 1.2 稳定性(重要) 两个相等的数据,如果经过排序后,排序算法能保证其 阅读详情

相关推荐

排序算法整理(冒泡排序,选择排序,直接插入排序,希尔排序,快速排序,堆排序,归并排序)

排序算法 ​ 排序即将一个数据元素的任意序列,重新排列称一个按关键字有序的序列。 ​ 根据在排序过程中排序的记录是否全部被放置在内存中,排序分为两种,内部排序和外部排序。 内部排序:在排序期间数据对象全部存放在内存的排序 外部排序:在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内存和外存之间移动的排序。 对于排序来说,只有两个最基本的操作,第一个就是比较,比较不同数据之间的关键字的大小关系;第二个就是移动,在得到比较结果之后,按照一定的规则来移动元素使其最终有序。 文章目

weixin_44267007的博客 2154

直接插入排序

排序 概念 1.1 排序 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 平时的上下文中,如果提到排序,通常指的是排升序(非降序)。 通常意义上的排序,都是指的原地排序(in place sort)。 1.2 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法是具备稳定性的排序 算法。 9 , 5 , 2...

Mr.yang的博客 484

实验报告——各种排序算法及性能分析

通过实际编码实现和对比不同算法的性能,我加深了对每种算法的理解,并学会了如何选择合适的排序算法来解决不同的问题。6.简单选择排序 (selectionSort 函数)选择排序算法是一种原址比较排序算法,它的工作原理是每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。5.快速排序 (quickSort 函数和)快速排序是一种分而治之的排序算法,它通过选取一个枢纽元素,并围绕它重新排列序列,使得枢纽左侧的所有元素都不大于枢纽,右侧的所有元素都不小于枢纽。

m0_74912170的博客 1974

【算法】直接插入排序解析

直接插入排序是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。

NoBack7--For the dream 4470

插入排序、归并排序、堆排序和快速排序的稳定性分析

在计算机科学中,排序是将一组数据按照特定顺序进行排列的过程。排序算法的效率和稳定性是评价其优劣的两个重要指标。稳定性指的是在排序过程中,相等的元素在排序后保持原有的相对顺序。本文将详细分析插入排序、归并排序、堆排序和快速排序这四种常见排序算法的稳定性,并通过浅显易懂的语言进行解释。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 2865

手把手教你玩转Infoseek舆情监测系统:从数据爬取到智能分析实战

别只会监测品牌名!一个有效的监测体系应该包括:// 完整的监测关键词策略brand: ["品牌名", "产品名", "缩写"],executives: ["CEO姓名", "高管姓名"],campaign: ["当前营销活动名称"],competitors: ["竞品A", "竞品B"],industry: ["行业通用关键词"],// 别忘了常见拼写错误和黑称defensive: ["常见的错误拼写", "用户起的黑称"]产品优化:从用户吐槽中发现改进点市场洞察。

2501_93332955的博客 756

排序算法-插入排序

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。 就类似于我们在玩扑克牌时把扑克牌从小到大排序的过程,从我们拿到牌以后,每摸一张牌,就把摸到的牌插入到我们之前排好的牌中,当我们摸完牌之后牌就是有序的。

qq_45967533的博客 6861

2025年第十六届蓝桥杯省赛C/C++大学B组 个人题解

也是写了写部分题解,朱波也是狠狠水了个省二┭┮﹏┭┮,毕竟许多算法知识没怎么学。

2301_80173664的博客 2431

c语言——直接插入排序实现(时间复杂度与空间复杂度分析)

c语言——直接插入排序 插入排序就是将一个记录插入到已排好序的序列中,从而得到一个新的有序序列。 那问题是我们要排序的是一个数组,哪里来一个排好序的序列呢?这时,我们可以把数组下标为0的元素想像成一个有序的数组,后面的元素和他比较。 以升序为例 升序 //升序 void InsertSort(int arr[],int len) { for (int i = 1; i < len; ++i) { if (arr[i] < arr[i - 1]) { int temp =

mirana的专栏 9636

Pycharm环境配置完整教程

本文主要介绍python解释器安装、Pycharm环境配置以及运行第一个程序的零基础的教程,即使是python小白也能正确配置相应的python学习环境哦!

悠眠小虫的博客 2万+

LibTV保姆级教程:从提示词到AI视频成片全流程

AI视频生成技术正以前所未有的速度重塑内容创作行业,过去需要编剧、摄影、剪辑等多角色协作的复杂流程,如今借助AI绘画与图生视频等核心能力,一个人也能完成高质量短视频制作。理解提示词工程是掌控AI视频创作的关键,通过精准描述主体、环境、光线与运镜,可以显著提升生成画面的稳定性与专业度。而图生视频技术则让静态分镜自然流动,有效解决角色一致性与场景漂移等常见问题。这类工具已广泛应用于产品宣传、剧情短片、社交媒体内容生产等场景,大幅降低了视频创作门槛。本文以LibTV一站式AI视频创作平台为例,从核心概念到完整实操

weixin_29046035的博客 953

Java集合与数据结构——七大排序算法的实现

七大基本排序算法

rain67的博客 1万+

3D Slicer的学习(二) 图像的分割

先对不同层级标注,然后点击Fill between slices -> Initialize -> Apply拖动层级颜色区域就会变成连续自适应的动态变化区域。如图,点击Level tracing,在图像上放置鼠标,会显示可能想要选中区域的轮廓,点击鼠标右键会将其显示为蓝色。然后点击Grow from seeds -> Initialize -> Apply,显示3D之后会自动扩展到其他位置的相同部位,从而展示整个部位。如图为copy之后,将黄色区域的颜色复制到原本的绿色区域。

tuweibazong的博客 6080

【排序算法】直接插入排序和希尔排序的全方位解读

本文深入解析了直接插入排序和希尔排序。直接插入排序思想是将未排序元素插入已排序序列合适位置,像整理扑克牌。希尔排序改进了直接插入排序,先按增量分组进行插入排序,使数据接近有序,再整体排序。以数组为例详细展示步骤,代码中通过控制增量和循环实现。最后总结两者特点及适用场景,直接插入排序适小规模或基本有序数据,希尔排序更适合大规模数据,强调根据实际需求选择算法以提高效率和性能。

A Charmer 的博客 1903

SD-WAN组网案例——数据中心

SD-WAN组网案例——数据中心

2301_78457663的博客 705

手把手教你完成基于matlab的路面裂缝检测系统设计

裂缝是路面病害最早的形态之一,只有在裂缝出现的早期进行维护,才能有效地提高公路的使用寿命。因此,路面裂缝的检测识别系统对于提升公路质量有着重大的意义。首先,对路面裂缝图像进行相应的预处理,目的是减小环境因素的影响,消除无用的噪点。然后提取目标图像特征,判断路面裂缝类型,标记出路面裂缝的位置。最后通过设计的 GUI 界面来集成各个关键步骤,显示所得到的试验结果。仿真结果表明,设计的路面裂缝检测识别系统是高效可行的。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1216

排序算法的详解和分析对比(详细讲解)

排序算法各式各样,每种排序算法的思想也大同小异。读者应该深度了解每种算法的基本思想、排序每一步过程细节和每种排序的特性,看到特定的序列,应该立马想到最适合的排序方法。一些简单的排序算法中,虽然效率不高,但是在低数量规模情况下,就比如一万数量级以下,一般运行时间还能可以被人们所接受,零点几秒左右很难被察觉出来。但是如果到了十万数量级,排序就需要非常久的时间,可能会导致我们一些系统会出现误差,从而引起巨大的麻烦和问题。

gongjunbox的博客 9592

Python 爬虫实战:Twitter 数据定向抓取(特定话题 + 用户推文爬取与分析)

在社交媒体研究、舆情监测和市场分析等领域,Twitter 数据具有极高的价值。本文将详细介绍如何使用 Python 构建一个完整的 Twitter 数据爬取系统,包括特定话题和用户推文的爬取与分析。我们将涵盖从认证到数据存储、清洗、分析和可视化的全流程。

u014481728的博客 1036

排序算法——直接插入排序和希尔排序

希尔排序是直接插入排序的优化,两者关系十分密切,但是要记住希尔排序不稳定,直接插入排序是稳定的✨原创不易,还希望各位大佬支持一下👍点赞,你的认可是我创作的动力!⭐️收藏,你的青睐是我努力的方向!✏️评论,你的意见是我进步的财富!httpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttps。.........

weixin_57154303的博客 947

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

七大经典排序算法总结【详解】

数据量规模较小,考虑插入或选择。当元素分布有序时插入将大大减少比较和移动记录的次数,如果不要求稳定性,可以使用选择,效率略高于插入;数据量规模中等,使用希尔排序;数据量规模较大,考虑堆排序(元素分布接近正序或逆序)、快速排序(元素分布随机)和归并排序(稳定性);一般来说不使用冒泡。

weixin_63189874的博客 8696

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

排序——插入排序(直接插入排序、希尔排序、折半插入排序)

排序这个文章我本来想写一篇的,但是想了想太长了,最后我还是决定拆开来写吧。第一部分主要是讲插入排序的,包括直接插入排序和希尔排序。 直接插入排序 基本思想: 依次将待排序序列中的每一个记录插入到一个已排好序的序列中,直到全部记录都排好序。 解读: 可以想一下打扑克的时候,每抓到一张牌就会插入到你手中已经按顺序理好的牌中。 排序过程: (1)将整个待排序的记录划分为有序区和无序区,初始时有序区为待...

我是菜鸡 3123

【算法】常见排序算法总结

排序排序的基本概念定义算法稳定性应用常见的基于比较类的排序插入排序原理实现排序性能分析 排序的基本概念 定义 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列。分内部排序和外部排序。若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程。 注意: 1.平时上下文中所提到的排序,默认指的是排升序,而非降序 2

沐北的博客 3765

数据结构 Java数据结构 --- 十大排序

1.直接插入排序 1.1 动图演示 1.2 插入排序的思路: 从第一个元素开始,这里我们第一个元素是已排序的. 取下一个元素,和有序序列的元素从后往前比较.( 有序区间 : [0,i) ) 如果得到的有序序列的元素 比 该元素大 则 将取得的有序元素往后放 重复3操作,直到得到的有序元素 比 该元素小, 或者 有序元素比完了.记录这个位置 然后将该元素放入到这个位置. 遍历数组,重复2~5的操作. 1.3 代码实现: /** * 时间复杂度: * 最好的情况.

wwzzzzzzzzzzzzz的博客 2254

初阶数据结构——经典排序算法

????????想快速入门数据结构,推荐订阅作者的初阶数据结构专栏!此专栏预计更新:顺序表,链表,栈,队列,二叉树,排序算法等等 ????????初阶数据结构我们通过c语言实现,所以此专栏也可以帮助大家巩固大家的c语言知识 ????????源代码已上传至我的码云 前言 非常感谢各位小伙伴的支持,我们的初阶数据结构系列在经过这篇文章后,也迎来了它的完结! 这个系列我们使用纯c语言实现了一些简单的数据结构,用它们解决了一些简单的问题 当年,可能有的小伙伴会问了:为啥作者没有收录图或者其它的数据结构啊

dtxew love c++ 5914

【数据结构与算法】万字剖析八大排序(直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序)

八大排序详解

喜欢就坚持吧 1987

深圳大学算法实验一——排序算法性能分析

本文对冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、基数排序、堆排序、计数排序九种排序算法进行了介绍和实现,并且测试了它们的运行效率,记录运行时间并绘制成折线图进行对比。

weixin_52828997的博客 5520
上一篇: 【排序算法】详解冒泡排序及其多种优化&稳定性分析
下一篇: 深度分析c++引用的本质以及引用与指针的区别
kklovecode
博客等级 码龄4年 127粉丝 29原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kklovecode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值