您好、欢迎来到现金彩票网!
当前位置:2019全年免费资料大全 > 桶链算法 >

《数据结构与算法》——九个内部排序的总结

发布时间:2019-07-21 19:09 来源:未知 编辑:admin

  内部排序在考研中会涉及到九种排序算法,分别是:直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序和基数排序。

  本文本着易于理解、易于记忆的方法针对9个算法,从原理、算法思想、C++代码、时间复杂度、空间复杂度等方面进行逐个解析,并综合9个算法特点对比总结在某些特定情况下最优算法选择(待完成)。本文所有代码的编译环境为 :win10专业版 +  DEV C++ 5.11  + TDM-GCC 4.9.2 64bit 。

  定义一个已知序列A,其中序列A是由两个序列——有序序列A1和乱序序列A2组成,即A=A1+A2。

  取A2的首元素α与A1中各元素进行比较关键字值的大小,得出在A1中存在位置a1=αa2(若A1中的元素均小于α,则a2不存在,且α的位置应为A1序列的末端),将α插入该位置,有序序列中的元素大于α的元素依次后移。A1、A2序列的长度发生变化,重复操作直至A2序列中无元素存在。

  时间的消耗为两个方面,一个是查找位置(比较),一个是放置(交换)。查找位置时,需要以此元素的前一位置向前进行一一比较,直至找到位置,并在比较的过程中进行元素的交换,最后将该元素插入目标位置,随后进行下一元素的查找。

  最好的情况是该元素前所有的元素均小于该元素,即序列为正序序列,这样的比较次数即为n-1,并且无需交换移动元素,此时是时间复杂度为o(n)。

  最坏的情况是该元素前的所有元素均大于该元素,即序列为倒序序列,这样第i(2=i=n)个元素的比较次数(第一次比较+移动时比较)为i次,移动次数(临时存储+交换+最终放置)为i+1次,此时总消耗时间为i=2ni+i=2n(i+1)=n+3*(n-1)2,即时间复杂度为o(n²)。

  一般情况下,序列为随机序列,取最优和最差两种情况的平均值各约为n²4,所以一般情况下时间复杂度为o(n²)。

  空间复杂度,因为除最优情况下外,其他情况均只借用了一个元素大小空间来存储交换时的临时数据,所以时间复杂度为o(1)。

  折半插入算法和直接插入算法很类似,不同的是比较的过程:因为A1序列为有序序列,所以比较大小的时候,α首先和中间位置的元素a(mid)比较大小,若α a(mid),则α需和前部分A1[low,mid-1]比较,否则和后部分A1[mid+1,high]比较,以此类推,可以确定α的最终位置,进行元素的移动,随后进行下一元素的比较直到A2序列为空。

  放置(交换)所消耗的时间与直接插入相比完全相同。查找位置(比较)所进行的操作为:以当前序列中间元素为基准并以0.5的倍率减少序列的长度,单个元素比较次数最多为[log2n](向上取整)。

  最好的情况为正序,此时比较次数为n-1,移动次数为0,时间复杂度为o(n)。

  最坏的情况为逆序,此时比较次数为i=2n[log2i],移动次数为i=2n(i+1)=n+4*n2,时间复杂度分别为o(nlog2n) 和o(n²),起决定性的为后者,所以时间复杂度为o(n²)。

  希尔排序可以直接插入排序为理解基础。直接插入排序和折半插入排序在排序的过程中是以1为步长进行比较,即当前元素比较结束后比较相邻下一个元素。这样的话如果序列呈基本倒序的话,每个元素要移动的次数就会很多,致使程序运行消耗较多时间。于是提出了希尔排序,它的基本思想是:

  取一个小于n的步长,将原序列分割为若干个形如L[I,i+d,i+2d,…i+kd]的新子序列。例如:123456,取步长为2进行分割,得135,246两个序列。随后对于每个子序列内部进行直接插入排序,这样即完成一次操作。减少步长重复操作直至步长为1。

  一般情况下,设增量为d1=n2,[di+1=di2]向下取整,最后一个增量为1,即增量以12的倍率变化。

  时间复杂度当n在某个特定范围时,希尔排序的时间复杂度约为o(n1.3),在最坏的情况下希尔排序的时间复杂度为o(n2).(书上所写)

  与前两种插入方法相比较而言,希尔排序减少的时间体现在单个元素与有序序列的比较次数以及有序序列中元素后移的次数。

  冒泡排序是我学习计算机以来接触的第一个排序算法,当时就感觉这种方法比较慢,理解起来大的元素(气泡)先往上浮动。

  定义一个已知序列A,其中序列A是由两个序列——有序序列A1和乱序序列A2组成,即A=A2+A1,长度为n=a+b;

  在A2中取第一个元素α和第二个元素β比较大小,若αβ,则交换两个元素,若α=β,则不进行操作。随后,第二个元素和第三个元素比较,以此类推,直到比较/交换完A2的最后一个元素为止,将A2最后一个元素添加到A1的首位,序列长度作相应变化。直到a=0或者此次排序元素位置未发生变动为止,此时序列为正序序列。

  最好的情况:顺序序列,此时需比较n-1次,移动0次,时间复杂度为o(n).

  最坏的情况:倒序序列,此时第i个元素需比较和移动n-i次,求和得n(n-1)2,总时间为n(n-1),所以时间复杂度为o(n²)。

  快速排序是对冒泡排序的一种改进。快速排序是基于分治思想的,简单来讲就是,选定一个特定元素并找出其最终位置,这样的话一个混乱序列就变成了两个分散的子序列,对于每个子序列再执行上述过程直至子序列长度为1为止,此时整个序列即是有序的。

  例如:53974621,如果直接用冒泡排序,第一趟结果展示:35946219,此时前7个元素仍为无顺序,因为这一趟的结果说明前7个元素都比9小,即它们在一个“属于它们的空间”,但不精确,没有更多的信息说明它们各自在什么位置,下一次前7个元素再分出一个属于前6个元素的空间,以此类推。

  而快速排序的结果为1324 5 679,这个结果给出的就是,比5小的元素在前4位,比5大的元素在后面,可以清楚地看到除元素5以外剩余7个的位置相对来讲准确。这样再对两个子序列分别使用快速排序,以此类推。

  由此可见,快速排序执行一趟获得的信息比冒泡排序获取的信息要更多更快,所以快速排序明显快于冒泡排序。当然这是从一个例子的角度去分析理解的。

  从原理上来讲,这里引入分治法的概念思想,分治法是一个可以解决具有重复性的复杂问题的方法。它的步骤是:将母问题分解为若干个子问题——若子问题好解决则直接求解,否则继续进行分解(递归)——合并子问题的求解得到母问题的解。

  快速排序速度较快的原因就是它不用进行重复的比较和交换,前序列的元素是不会和后序列的元素进行比较,更不用说交换了。但是冒泡排序中不管你是什么元素,一个字,比!再来个字,换!那么这个时候时间差就出来了。

  本算法时间消耗分为比较和交换,具体的时间推导过程在《算法导论》一书中有说明,现在没有兴趣去看,等后面看了,再进行补充。

  最好的情况:每次选定的元素正好是当前序列的中间位置元素,此时时间复杂度o(nlog2n)。

  空间复杂度:使用到了递归,所需空间变大, o(log2n)。(证明过程后期补上)

  简单选择算法可以理解为,经过不断比较选出乱序序列中最大的元素并将其放置于最高位,再选出次高元素放于次高位,以此类推。

  本算法时间消耗分为比较和交换,比较需要每个元素依次比较,交换是找到最大元素后才进行交换,故最多交换n-1次。当然交换所消耗的时间和比较所消耗的时间相比微不足道。o(n2)

  最坏的情况: 每趟比较都需要交换元素,同上面所说,交换时间起不了决定作用。o(n2)

  堆排序是一种树形选择排序的方法,它的特点是将序列L[1…n]看作是完全二叉树的顺序存储结构。根据父母节点和子女节点之间的数据关系,可以选择出最大或最小的元素,以此类推,父母节点的父母节点的…….父母节点即根节点即为整个序列中最大或最小的元素,选出最大元素的操作被称为建立大顶堆,选出最小元素的操作被称为建立小顶堆。(概念可以查询资料,当然这个也会在我的未来几篇博客中进行讲解。)

  以自下向上调整大顶堆为例,初始序列为 asdfghjklqwert(n=14)

  对于堆排序来讲,将当前堆最高位与最低位的值进行交换,此时可以达到一个值完成排序的操作。

  将新堆设置为jatlsrdkfqgeh,即去掉最后一个最大的元素,重复上述操作,直至所有的元素均放置于相应位置。

  本算法时间消耗:建堆时间为o(n),之后又n-1次向下调整操作,每次调整的时间复杂度为o(h),在平均情况下其时间复杂度为o(nlog2n)。【摘自《2019王道数据结构》】

  最好的情况:逆序序列构建大顶堆,正序序列构建小顶堆,只比较不交换元素位置。

  归并排序算法也是基于分治法,它的核心思想是将那个有序的序列进行合并,序列的长度由1开始依次以整数倍增大至最终的n,每次不同的长度便进行一次合并,最终合并为最终序列。

  本算法时间消耗每进行一趟算法,其时间复杂度为,o(n),总共执行([log2n]向上取整)次,所以总的时间复杂度为o(nlog2n)。

  基数排序又被称为“桶排序”,它不是基于比较数据而进行排序,而是基于多关键字排序的思想进行排序的。借助“分配”和“收集”两种操作对单逻辑关键字进行排序。基排又被分为最高位优先(MSD)和最低位优先(LSD)排序。

  以kid为依据,将ai存放至Qkid中,直至将所有的ai全部插入完毕,将所有的Q首尾连接组成新的序列。随后以kid-1位依据,重复以上操作,直到ki0这一步执行结束,此时得到正序序列。

  本算法时间消耗:基数排序需要进行d趟分配和收集,一趟分配需要o(n),一趟收集需要o(r),所以时间复杂度为o(d(n+r))。

  空间复杂度: 一趟排序需要的辅助空间是r个队列,且这些队列可以重复使用。所以空间复杂度为o(n)。

  八大排序算法概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。  ...博文来自:小哲的博客

  内部排序分类插入类排序    基本思想:在已排好序列的子集的基础上,将下一个待排记录插入到已排好序列的记录子集,直到将所有待排记录全部插入为止。  直接插入排序:将每一个待排元素i插入到前i-1个排序...博文来自:的博客

  总结自《数据结构教程》,书上的太理论化了,本文简单梳理一下给你一组数字怎么去排序。本篇不涉及代码和理论,只说说排序过程。一、插入排序:【例子】序列:5,7,9,3,1第一趟:[5]7931第二趟:[5...博文来自:dcy249的博客

  排序基本上属于算法里面必须要掌握的一块了,也是各家面试的重点考察的部分之一。所谓内部排序,就是参与排序的数据都存储在内存中。分析排序算法的性能,一般从算法的时间复杂度、空间复杂度和稳定性三个方面着手。...博文来自:Yngz_Miao的博客

  临近期末,学了一学期“数据结构”让写课程设计,就选了“内部排序算法的性能分析”。主要是分析关键字的移动次数和比较次数,其中关键字若发生交换,则记为三次移动。下列代码中,“move”记为关键字的移动次...博文来自:冯卿的博客

  1、需求分析(1)输入数据的形式为:伪随机数产生程序产生,且每次输入数不少于100个,至少要用5组不同的输入数据(2)输出的形式为:输出关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)...博文来自:xu_Melon的博客

  我们通常说的排序算法指的是内部排序算法,即数据在内存中进行排序。首先先来看一下我们学过的排序都有什么?排序可以大的方面分为比较排序和非比较排序?比较排序有:1、冒泡排序2、选择排序3、插入排序(1)二...博文来自:flowing_wind的博客

  借鉴博客:目的:1.掌握常见的内部排序算法的思想及其适用条件。2.掌握常见的内部排序算法的程序实现...博文来自:far away

  八大内部排序算法的C++实现算法分类八大排序算法可以分为以下5类:插入类排序:直接插入排序、希尔排序选择类排序:简单选择排序、堆排序交换类排序:冒泡排序、快速排序归并类排序:归并排序基数类排序:基数排...博文来自:日沉云起的博客

  排序的问题比较杂,想通过这篇博客理顺一下,基础的概念这里不累述。总体的知识框架如下:1、关于适用场景:①直接插入排序适用于排序表和数据量不大的排序表;②取一大堆数据中K个最大(小)的元素,优先选用堆排...博文来自:的博客

  一、数据结构的基本概念1、数据:描述客观事物的符号,是计算机中可以操作的对象,能被计算机识别,并输入给计算机处理的符号集合2、数据元素:是组成数据的有一定意义的基本单位,在计算机中通常作为整体处理,也...博文来自:Fcwyl000的博客

  冒泡排序选择排序插入排序归并排序快速排序堆排序希尔排序眼看着就要实习,为了巩固基础,回顾并总结排序算法。参考自:冒泡排序时间复...博文来自:让勤奋成为习惯

  数据结构内部排序和外部排序1.1概念1.2衡量方法1.3区分与汇总1.1概念内排序:在排序过程中,所有元素调到内存中进行的排序。外排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序...博文来自:归档的博客

  排序算法常见的有八种:算法一:插入排序插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。算法步骤:1)将第一待排序序列...博文来自:x的博客

  前言本篇文章主要介绍内部排序与外部排序的知识,如果你和我一样还不知道内部排序和外部排序为何物的话,不妨看看我的理解正文由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两大类:...博文来自:黄庆庆的世界

  内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程。外部排序,指的是待排序记录的数量很大,以致内存一次不能够容纳全部记录,在排序过程中尚需对外存进行访问的排序过程(摘自严蔚敏版数据结构)...博文来自:csulfy的博客

  内部排序算法的实现与比较1)问题描述在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。...博文来自:zhagoodwell查的博客

  数据结构(严蔚敏)第十章:内部排序博文来自:yuansaijie0604的专栏

  此文涉及的算法包括1.插入排序1.1直接插入排序直接插入排序算法三点(1)R[i]向前顺序查找,设置监视哨在R[0]位置R[0]=R[i];for(intj=i;R[0].Key...博文来自:青春只是场梦

  冒泡排序基本思想:两两相邻记录的关键字,如果反序则交换,直到没有反序记录为止。voidBubbleSort(intk[],intn){//冒泡排序是从下往上冒泡,相邻两个比较inttemp,flag;...博文来自:Super_Sloppy的博客

  五种内部排序算法性能比较1.直接插入排序算法将一个待排序的记录插入到若干个已排好序的有序记录中的适当位置,从而得到一个新的、记录数增加1的有序数据序列,直到插入完成。在最开始,整个有序数据序列只有一个...博文来自:baidu_38306313的博客

  由于时间和水平有限,肯定有错误或者写得不好的地方欢迎在文章下评论指出。涉及语言:py3:注重算法本身的知识c/c++:实现基础数据结构和算法java:实现较复杂数据结构一、概述c语言知识体系算法体系参...博文来自:hebtu666

  内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序期间全部对象太多,不能同时存放在内存中,必须根据排序过程的要求,不断在内,外存间移动的排序。 位置1.内部排序内部排序是排序的基础,...博文来自:xiaohui987987的博客

  数据结构——内部排序总结各种排序算法的性质对比参考资料各种排序算法的性质对比算法种类平均时间复杂度空间复杂度稳定性直接插入排序O(n*n)(最好可达O(n))O(1)是冒泡排序O(n*n)(最好可达O...博文来自:doubeliefs blog

  1.按平均的时间性能来分:(1)时间复杂度为O(nlog2n):快速排序、堆排序和归并排序;(2)时间复杂度为O(n2):直接插入排序、起泡排序和简单选择排序;(3)当待排记录按关键字有序,直接插入排...博文来自:i6223671的博客

  这几天又认真看了一遍《大话数据结构》和《数据结构-C语言版》,本文结合自己的理解写的笔记,数据结构的代码调试好后会在后续的博文中进行详细介绍。【1】数据结构(DataStructure)数据结构+算法...博文来自:Audio and Video Development

  对数据结构的学习断断续续持续了有三个月之久,随着《数据结构与算法经典问题分析》Java语言描述一书的结束,数据结构的学习也暂告一段落。这并不意味着停止学习算法,后面我将会继续学习并不断提高自己表述能力...博文来自:小菜鸟入门

  常用排序算法的复杂度分析整理具体分析如下:1冒泡排序(BubbleSort)冒泡排序是最慢的排序算法。在实际运用中它是效率最低的算法。它通过一趟又一趟地比较数组中的每一个元素,使较大的数据下沉,较小的...博文来自:简约人生的博客

  桶排序和基数排序的对比详情请点击这里计数排序快速排序堆排序归并排序希尔排序选择排序插入排序冒泡排序...博文来自:weixin_44333359的博客

  数据结构与算法是学习编程者的必修课,下面是我学习完之后的知识点梳理与总结。本来用xmind做的时候把重要知识点都附了博客链接,但是xmind导出来后打不开了。不用担心我把相关内容放在了数据结构专栏里。...博文来自:龙跃十二

  基数排序基数排序是一种“分配式排序”。它将整数各个位进行切割,按位排序。基数排序会使用到桶(Bucket),通过将要比较的位(个位、十位、百位…),将要排序的元素分配至0~9个桶中,借以达到排序的作用...博文来自:catherine_sfy的博客

  一、原理   这里所讲的堆是具有如下性质的完全二叉树:大顶堆:每个结点的值都大于或等于其左右孩子结点的值;小顶堆:每个结点的值都小于或等于其左右孩子结点的值。                     ...博文来自:ZHAO

  python数据结构与算法——图的最短路径(Dijkstra算法)#Dijkstra算法——通过边实现松弛#指定一个点到其他各顶点的路径——单源最短路径#初始化图参数G={1:{1:0,2:1,3:1...博文来自:肆小猿的博客

  贪婪算法memset(起始地址,覆盖内容,字节长度)sizeof(指针)返回的是指针指向区域的大小函数作用,将覆盖内容以一个字节为长度覆盖在起始地址之后的内存之中,因此,此函数并不能给int型变量赋值...博文来自:weixin_40918019的博客

http://linkzoo.net/tongliansuanfa/413.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有