湖北高校军训裤裆开裂(军训心得体会800字)

  

湖北高校军训裤裆开裂(军训心得体会800字)

  所谓排序,即将原来无序的一个序列重新排列成有序的序列。

  排序方法中涉及到稳定性,所谓稳定性,是指待排序的序列中有两个或两个以上相同的项,在排序前和排序后看这些相同项的相对位置有没有发生变化,如果没有发生变化,即该排序方法是稳定的,如果发生变化,则说明该排序方法是不稳定的。

  如果记录中关键字不能重复,则排序结果是唯一的,那么选择的排序方法稳定与否就无关紧要了;如果关键字可以重复,则在选择排序方法时,就要根据具体的需求来考虑选择稳定还是不稳定的排序方法。那么,哪些排序算法是不稳定的呢?

  “快些选堆”:其中“快”指快速排序,“些”指希尔排序,“选”指选择排序,“堆”指堆排序,即这四种排序方法是不稳定的,其他自然都是稳定的。

  排序算法分类

  1、插入类排序

  即在一个已经有序的序列中,插入一个新的记录,就好比军训排队,已经排好一个纵队,这时来了个新家伙,于是新来的“插入”这个队伍中的合适位置。这类排序有:直接插入排序、折半插入排序、希尔排序。

  2、交换类排序

  该类方法的核心是“交换”,即每趟排序,都是通过一系列的“交换”动作完成的,如军训排队时,教官说:你比旁边的高,你俩交换下,还比下一个高就继续交换。这类排序有:冒泡排序、快速排序。

  3、选择类排序

  该方法的核心是“选择”,即每趟排序都选出一个最小(或最大)的记录,把它和序列中的第一个(或最后一个)记录交换,这样最小(或最大)的记录到位。如军训排队时,教官选出个子最小的同学,让他和第一个位置的同学交换,剩下的继续选择。这类排序有:选择排序、堆排序。

  4、归并类排序

  所谓归并,就是将两个或两个以上的有序序列合并成一个新的有序序列。如军训排队时,教官说:每个人先和旁边的人组成二人组,组内排好队,二人组和旁边的二人组组成四人组,内部再排好队,以此类推,直到最后全部同学都归并到一个组中并排好序。这类排序有:(二路)归并排序。

  5、基数类排序

  此类方法较为特别,是基于多关键字排序的思想,把一个逻辑关键字拆分成多个关键字,如一副扑克牌,按照基数排序思想可以先按花色排序,则分成 4 堆,每堆再按 A-K 的顺序排序,使得整副扑克牌最终有序。

  排序算法分析

  本文主要分析的排序算法有:冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序。

  交换算法

  由于大部分排序算法中使用到两个记录相互交换的动作,因此将交换动作单独封装出来,便于各排序算法使用。

  1 //交换函数2 Array.prototype.swap = function(i, j) {

  3 var temp = this[i];

  4 this[i] = this[j];

  5 this[j] = temp;

  6 }

  插入排序

  算法思想:每趟将一个待排序的关键字,按照其关键字值的大小插入到已经排好的部分序列的适当位置上,直到插入完成。

  1 //插入排序 2 Array.prototype.insertionSort = function() {

  3 for (var i = 1; i < this.length; ++i)

  4 {

  5 var j = i,

  6 value = this[i];

  7 while (j > 0 && this[j - 1] > value)

  8 {

  9 this[j] = this[j - 1];

  10 --j;

  11 }

  12 this[j] = value;

  13 }

  14 }

  算法性能:在内层循环中 this[j]=this[j-1],这句是作为基本操作。考虑最坏情况,即整个序列是逆序的,则其基本操作总的执行次数为 n*(n-1)/2,其时间复杂度为 O(n*n)。考虑最好情况,即整个序列已经有序,则循环内的操作均为常量级,其时间复杂度为O(n)。因此本算法平均时间复杂度为 O(n*n)。算法所需的额外空间只有一个 value,因此空间复杂度为 O(1)。

  希尔排序

  算法思想:希尔排序又叫做缩小增量排序,是将待排序的序列按某种规则分成几个子序列,分别对这几个子序列进行插入排序,其中这一规则就是增量。如可以使用增量 5、3、1 来分格序列,且每一趟希尔排序的增量都是逐渐缩小的,希尔排序的每趟排序都会使得整个序列变得更加有序,等整个序列基本有序了,再使用一趟插入排序,这样会更有效率,这就是希尔排序的思想。

  1 //希尔排序 2 Array.prototype.shellSort = function() {

  3 for (var step = this.length >> 1; step > 0; step >>= 1)

  4 {

  5 for (var i = 0; i < step; ++i)

  6 {

  7 for (var j = i + step; j < this.length; j += step)

  8 {

  9 var k = j, value = this[j];

  10 while (k >= step && this[k - step] > value)

  11 {

  12 this[k] = this[k - step];

  13 k -= step;

  14 }

  15 this[k] = value;

  16 }

  17 }

  18 }

  19 }

  算法性能:希尔排序的时间复杂度平均情况为 O(nlogn),空间复杂度为 O(1)。希尔排序的增量取法要注意,首先增量序列的最后一个值一定是 1,其次增量序列中的值没有除 1之外的公因子,如 8,4,2,1这样的序列就不要取(有公因子 2)。

  冒泡排序

  算法思想:通过一系列的“交换”动作完成的,首先第一个记录与第二个记录比较,如果第一个大,则二者交换,否则不交换;然后第二个记录和第三个记录比较,如果第二个大,则二者交换,否则不交换,以此类推,最终最大的那个记录被交换到了最后,一趟冒泡排序完成。在这个过程中,大的记录就像一块石头一样沉底,小的记录逐渐向上浮动。冒泡排序算法结束的条件是一趟排序没有发生元素交换。

  1 //冒泡排序2 Array.prototype.bubbleSort = function() {

  3 for (var i = this.length - 1; i > 0; --i)

  4 {

  5 for (var j = 0; j < i; ++j)

  6 if (this[j] > this[j + 1])

  7 this.swap(j, j + 1);

  8 }

  9 }

  算法性能:最内层循环的元素交换操作是算法的基本操作。最坏情况,待排序列逆序,则基本操作的总执行次数为 (n-1+1)*(n-1)/2=n(n-1)/2,其时间复杂度为 O(n*n);最好情况,待排序列有序,则时间复杂度为O(n),因此平均情况下的时间复杂度为 O(n*n)。算法的额外辅助空间只有一个用于交换的temp,所以空间复杂度为 O(1)。

  快速排序

  算法思想:以军训排队为例,教官说以第一个同学为中心,比他矮的站他左边,比他高的站他右边,这就是一趟快速排序。因此,一趟快速排序是以一个枢轴,将序列分成两部分,枢轴的一边比它小(或小于等于),另一边比它大(或大于等于)。

  1 //递归快速排序 2 Array.prototype.quickSort = function(s, e) {

  3 if (s == null)

  4 s = 0;

  5 if (e == null)

  6 e = this.length - 1;

  7 if (s >= e)

  8 return;

  9 this.swap((s + e) >> 1, e);

  10 var index = s - 1;

  11 for (var i = s; i <= e; ++i)

  12 if (this[i] <= this[e]) this.swap(i, ++index);

  13 this.quickSort(s, index - 1);

  14 this.quickSort(index + 1, e);

  15 }

  算法性能:快速排序最好情况下时间复杂度为 O(nlogn),待排序列越接近无序,则该算法效率越高,在最坏情况下时间复杂度为O(n*n),待排序列越接近有序,则该算法效率越低,算法的平均时间复杂度为 O(nlogn)。就平均时间而言,快速排序是所有排序算法中最好的。该算法的空间复杂度为 O(logn),快速排序是递归进行的,需要栈的辅助,因此需要的辅助空间比前面几类排序方法要多。

  快速排序的效率和选取的“枢轴”有关,选取的枢轴越接近中间值,算法效率就越高,因此为了提高算法效率,可以在第一次选取“枢轴”时做文章,如在数据堆中随机选取 3 个值,取 3 个值的平均值作为“枢轴”,就如抽样一般。关于具体如何提高快速排序算法的效率,在本文不做详细介绍了,点到为止。(感兴趣的读者可以自行去研究)

  选择排序

  算法思想:该算法的主要动作就是“选择”,采用简单的选择方式,从头至尾顺序扫描序列,找出最小的一个记录,和第一个记录交换,接着从剩下的记录中继续这种选择和交换,最终使序列有序。

  1 //选择排序 2 Array.prototype.selectionSort = function() {

  3 for (var i = 0; i < this.length; ++i)

  4 {

  5 var index = i;

  6 for (var j = i + 1; j < this.length; ++j)

  7 {

  8 if (this[j] < this[index])

  9 index = j;

  10 }

  11 this.swap(i, index);

  12 }

  13 }

  算法性能:将最内层循环中的比较视为基本操作,其执行次数为 (n-1+1)*(n-1)/2=n(n-1)/2,其时间复杂度为 O(n*n),本算法的额外空间只有一个 temp,因此空间复杂度为O(1)。

  堆排序

  算法思想:堆是一种数据结构,最好的理解堆的方式就是把堆看成一棵完全二叉树,这个完全二叉树满足任何一个非叶节点的值,都不大于(或不小于)其左右孩子节点的值。若父亲大孩子小,则这样的堆叫做大顶堆;若父亲小孩子大,这样的堆叫做小顶堆。根据堆的定义,其根节点的值是最大(或最小),因此将一个无序序列调整为一个堆,就可以找出这个序列的最大(或最小)值,然后将找出的这个值交换到序列的最后(或最前),这样有序序列元素增加 1 个,无序序列中元素减少 1 个,对新的无序序列重复这样的操作,就实现了序列排序。堆排序中最关键的操作是将序列调整为堆,整个排序的过程就是通过不断调整使得不符合堆定义的完全二叉树变为符合堆定义的完全二叉树的过程。

  堆排序执行过程(大顶堆):

  (1)从无序序列所确定的完全二叉树的第一个非叶子节点开始,从右至左,从下至上,对每个节点进行调整,最终将得到一个大顶堆。将当前节点(a)的值与其孩子节点进行比较,如果存在大于a值的孩子节点,则从中选出最大的一个与a交换。当a来到下一层的时候重复上述过程,直到a的孩子节点值都小于a的值为止。

  (2)将当前无序序列中第一个元素,在树中是根节点(a)与无序序列中最后一个元素(b)交换。a 进入有序序列,到达最终位置,无序序列中元素减少 1 个,有序序列中元素增加 1 个,此时只有节点 b 可能不满足堆的定义,对其进行调整。

  (3)重复过程 2,直到无序序列中的元素剩下 1 个时排序结束。

  1 //堆排序 2 Array.prototype.heapSort = function() {

  3 for (var i = 1; i < this.length; ++i)

  4 {

  5 for (var j = i, k = (j - 1) >> 1; k >= 0; j = k, k = (k - 1) >> 1)

  6 {

  7 if (this[k] >= this[j])

  8 break;

  9 this.swap(j, k);

  10 }

  11 }

  12 for (var i = this.length - 1; i > 0; --i)

  13 {

  14 this.swap(0, i);

  15 for (var j = 0, k = (j + 1) << 1; k <= i; j = k, k = (k + 1) << 1)

  16 {

  17 if (k == i || this[k] < this[k - 1])

  18 --k;

  19 if (this[k] <= this[j])

  20 break;

  21 this.swap(j, k);

  22 }

  23 }

  24 }

  算法性能:完全二叉树的高度为 [log(n+1)],即对每个节点调整的时间复杂度为 O(logn),基本操作总次数是两个并列循环中基本操作次数相加,则整个算法时间复杂度为 O(logn)*n/2+O(logn)*(n-1),即 O(nlogn)。额外空间只有一个 temp,因此空间复杂度为 O(1)。

  堆排序的优点是适合记录数很多的场景,如从 1000000 个记录中选出前 10 个最小的,这种情况用堆排序最好,如果记录数较少,则不提倡使用堆排序。另外,Hash 表 + 堆排序是处理海量数据的绝佳组合,关于海量数据处理会在之后的博文中介绍到。

  归并排序

  算法思想:其核心就是“两两归并”,首先将原始序列看成每个只含有单独 1 个元素的子序列,两两归并,形成若干有序二元组,则第一趟归并排序结束,再将这个序列看成若干个二元组子序列,继续两两归并,形成若干有序四元组,则第二趟归并排序结束,以此类推,最后只有两个子序列,再进行一次归并,即完成整个归并排序。

  1 //归并排序 2 Array.prototype.mergeSort = function(s, e, b) {

  3 if (s == null)

  4 s = 0;

  5 if (e == null)

  6 e = this.length - 1;

  7 if (b == null)

  8 b = new Array(this.length);

  9 if (s >= e)

  10 return;

  11 var m = (s + e) >> 1;

  12 this.mergeSort(s, m, b);

  13 this.mergeSort(m + 1, e, b);

  14 for (var i = s, j = s, k = m + 1; i <= e; ++i)

  15 b[i] = this[(k > e || j <= m && this[j] < this[k]) ? j++ : k++];

  16 for (var i = s; i <= e; ++i)

  17 this[i] = b[i];

  18 }

  算法性能:可以选取“归并操作”作为基本操作,“归并操作”即为将待归并表中元素复制到一个存储归并结果的表中的过程,其次数为要归并的两个子序列中元素个数之和。算法总共需要进行 logn 趟排序,每趟排序执行 n 次基本操作,因此整个归并排序中总的基本操作执行次数为 nlogn,即时间复杂度为 O(nlogn),说明归并排序时间复杂度和初始序列无关。由于归并排序需要转存整个待排序列,因此空间复杂度为 O(n)。

  一些结论

  (1)快速排序、希尔排序、归并排序、堆排序的平均时间为 O(nlogn),其他的为 O(n*n)。

  (2)快速排序、希尔排序、选择排序、堆排序不稳定,其他的稳定。

  (3)经过一趟排序能够保证一个元素到达最终位置的是冒泡排序、快速排序、选择排序、堆排序。

  (4)元素比较次数和原始序列无关的是选择排序、折半插入排序。

  (5)排序趟数和原始序列有关的是交换类排序。

  (6)直接插入排序和折半插入排序的区别是寻找插入位置的方式不同,一个是按顺序查找方式,另一个是按折半查找方式。

  摘自博客园,博文作者:twobin

  博文出处:https://www.cnblogs.com/twobin

  

本文来自作者[饶建梗]投稿,不代表汉港号立场,如若转载,请注明出处:https://shcomm.cn/kepu/202501-45896.html

(14)

文章推荐

  • 抖音播放量购买超低价是真,精准解答落实_手机版29.97.39

    抖音播放量购买超低价是真?在抖音这个短视频平台上,播放量是衡量视频受欢迎程度的重要指标之一,许多创作者为了提高视频的曝光率和影响力,会考虑购买播放量,市面上关于抖音播放量购买的价格参差不齐,有的标榜“超低价”,这不禁让人疑惑:这些超低价的播放量购买服务是真实的吗?超低价播放量购买的风险我们要明白,抖

    2024年10月24日
    43
  • 包含子潇网络下单,最新精选解释落实_VIP64.38.60

    关于子潇网络下单的介绍在互联网时代,网络下单已经成为我们日常生活中不可或缺的一部分,子潇网络下单平台以其高效、便捷的特点,为广大用户提供了一站式的购物体验,我们就来详细了解一下子潇网络下单平台,以及如何利用这个平台进行购物。子潇网络下单的优势子潇网络下单平台拥有以下几大优势:1.商品种类丰富:平台

    2024年10月27日
    31
  • dy实名小号购买,人民网解析落实_GM版49.71.70

    前言在数字时代,实名小号的购买和使用成为了一些用户的需求,尤其是在需要保护个人隐私或者进行特定操作时,这一行为在很多国家和地区都是受到法律限制的,本文将探讨dy实名小号的购买问题,并结合人民网对相关政策的解析,为大家提供一些指导和建议。搜索引擎中的信息在各大搜索引擎中输入“dy实名小号购买”,我们会

    2024年10月27日
    56
  • “qq空间访客网址购买安全吗”,精准解答落实_iPad88.6.15

    随着社交媒体的普及,QQ空间成为了许多人展示自我、分享生活的重要平台,随着用户对个人空间的关注度提高,一些不法分子也开始利用各种手段来获取用户信息,其中就包括通过购买访客网址来获取用户数据,购买QQ空间访客网址真的安全吗?本文将从多个角度进行分析,为你提供一份详细的攻略。购买QQ空间访客网址的风险我

    2024年10月28日
    27
  • “包含qq点赞秒自动下单24小时下单在线”,和讯网最新精选解释落实_电脑版47.92.35

    前言在这个信息爆炸的时代,网络上充斥着各种信息,而搜索引擎成为了我们获取信息的重要工具,我们将深入探讨关于“包含qq点赞秒自动下单24小时下单在线”的话题,并结合和讯网最新精选解释落实_电脑版47.92.35的信息,以小红书分享类文章的结构,重新编写一篇原创攻略文章,这篇文章将贴近人工写作,避免AI

    2024年10月30日
    26
  • 包含互联网金融支持民生的词条

    民生易贷是正规的,民生易贷是民生电商旗下互联网金融平台,2014年7月上线从业机构应当选择符合条件的银行业金融机构作为资金存管机构,对客户资金进行管理和监督,实现客户资金与从业机构自身资金分账管理客户资金存管账户应接受独立审计并向客户公开审计结果从业机构应当对客户进行充分的信息披露,及时向。此外,

    2024年11月24日
    23
  • 关于Wi-Fi热点的使用技巧的信息

    1、1想要连接他人家的WiFi,首先需要确保对方已经开启了WiFi热点共享功能2在自己的手机上,打开WiFi设置,搜索可用的网络,找到对方提供的热点名称3选择该热点,输入对方设定的密码一旦密码正确,手机即可连接到对方的WiFi热点4手机作为WiFi热点的工作原理,是将手机接收的移动网络。2

    2024年11月25日
    23
  • 包含盘点2014的词条

    1、2014年中国大事件盘点1建国65周年中国迎全面深化改革元年2收入分配改革细则将出台养老金并轨可期3“单独二孩”新政将全面启动落地效果待观4不动产统一登记制度新型城镇化规划将面世5国企改革总体方案有望揭真容市场化成其核心6招考改革总体方案将出台欲破。2、2014年3

    2024年12月07日
    21
  • 包含自我提升与生活质量的词条

    终身学习是提升自我重要方式在信息爆炸时代,知识更新快速,不断学习才能跟上时代步伐终身学习不仅是生活方式,也是积极人生态度它要求保持好奇心,勇于探索未知,不断充实自我提升自我是一个全面过程,涉及个人成长适应社会实现目标提高生活质量与增强社会责任感通过不断学习进步,成为更完善的。这个过程能够锻炼个人的

    2025年01月22日
    4
  • “qq会员永久卡盟在线自助下单”,人民网解析落实_VIP17.90.55

    在数字时代,网络服务的便捷性让越来越多的人依赖于在线自助服务,尤其是对于QQ会员这样的服务,用户们总是希望能够找到一种既方便又实惠的方式来享受会员权益,关于“QQ会员永久卡盟在线自助下单”的话题引起了广泛关注,本文将结合人民网的相关解析,为您提供一份详尽的攻略,帮助您了解这一服务,并以小红书分享类文

    2024年10月30日
    16

发表回复

本站作者后才能评论

评论列表(4条)

  • 饶建梗
    饶建梗 2025年01月07日

    我是汉港号的签约作者“饶建梗”!

  • 饶建梗
    饶建梗 2025年01月07日

    希望本篇文章《湖北高校军训裤裆开裂(军训心得体会800字)》能对你有所帮助!

  • 饶建梗
    饶建梗 2025年01月07日

    本站[汉港号]内容主要涵盖:百科大全,生活小常识,经验分享,热点知识

  • 饶建梗
    饶建梗 2025年01月07日

    本文概览:    所谓排序,即将原来无序的一个序列重新排列成有序的序列。  排序方法中涉及到稳定性,所谓稳定性,是指待排序的序列中有两个或两个以上相同的项,在排序前和排序后看这些相同项的...

    联系我们

    邮件:汉港号@sina.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们