草庐IT

数组常用的几种排序方式

差不少 2023-04-07 原文

冒泡排序

冒泡拍排序:俩俩捉对比较,大或小就换位置,一直比下去,最大或者最小的放最后




最后的结果是从小到大(从1开始排列)

注意:如果要从大到小排列的话,就把compare方法中的a>b的判断改为a<b
https://blog.csdn.net/weixin_49950087/article/details/122088742

选择排序


选择排序:
在数组中先找出最小数的索引,设一个变量保存下来,找到就进行交换
最小的数和数组的第一个数进行交换,
以此类推,再把数组其他数字最小数的索引找出,再和数组的第二位数进行交换。

举例:
例:5,4,7,2,9,1,6

第一趟排序 :1,4,7,2,9,5,6

第二趟排序: 1,2,7,4,9,5,6

第三趟排序: 1,2,4,7,9,5,6

第四趟排序: 1,2,4,5,9,7,6
…….

首先在未排序序列中找到最大(小)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

不稳定的排序算法

不稳定的排序算法主要有以下四种:1、选择排序;2、快速排序;3、希尔排序(shell);4、堆排序

稳定的排序算法

稳定的排序算法有以下4种:1、冒泡排序;2、插入排序;3、归并排序 ;4、基数排序。

排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。

注意:
排序算法稳定性
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的
https://baike.baidu.com/item/排序算法稳定性/9763250

exchange用于选择排序
maxIndex始终为0,也就是第一个,arr.lengrh-1为最后一个,arr.length-1-i为最后的数字-当前循环的第几个(倒数第二,倒数第三等等一直到0第一个)

快速排序

js的sort()配合自己的写法:
https://blog.csdn.net/qq_34595425/article/details/122851284

js中⽤⽅法sort()为数组排序。sort()⽅法有⼀个可选参数,是⽤来确定元素顺序的函数。如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进⾏排序

注意:使用sort()需要自己写一个确认顺序的函数,作为参数使用

数组对象进⾏排序
sort⽅法接收⼀个函数作为参数,这⾥嵌套⼀层函数⽤来接收对象属性名,其他部分代码与正常使⽤sort⽅法相同.

递归排序(快速排序)

1.从数列中取出一个数作为参考,分区过程。
2.将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.对左右区间重复第二步,直到各区间只有一个数。
简易的快速排序(不使用sort())

.concat()两个数组连接的方法
concat拼接前,leftright为什么要再递归一次quickSort
最后输出重点
注意:因为不递归最后输出左边右边数字 排序可能并不一定会是从小到大所以要递归quickSort

因为每次递归都会把 左和右合并后的数组 的第一个拿来做leader,每次都会出现一个新的左和右数组,并且数组的长度会比之前少一个(因为第一个被拿去做为leader)

直到递归到最后数组中只剩一个值,这个值被拿去做leader,左右数组中值一个不剩,导致左右合并后的数组为空,跳出递归

这样其实也是把所有的值都和leader对比了一遍(其实和leader对比后,分为两块后,,再合成一个新数组,返回,循环往复操作)

递归的操作其实就是分为两块后,再次一一对比了一遍

但这种写法 性能较差

二分法插入排序

算法
二分法排序一般指本词条
二分法插入排序,简称二分排序,是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left<right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上。

算法思想简单描述:
二分法没有排序,只有查找。所以当找到要插入的位置时。移动必须从最后一个记录开始,向后移动一位,再移动倒数第2位,直到要插入的位置的记录移后一位。

复杂度分析
二分插入排序是稳定的与二分查找的复杂度相同;[1]
最好的情况是当插入的位置刚好是二分位置 所用时间为O(log2n);
最坏的情况是当插入的位置不在二分位置 所需比较次

插入排序

两个循环,内部循环,一个一个插入,只要上一个比大或者小就立即插入

插入排序,一旦你遇到比自己大或小的了,你就知道,后面都是比自己大或小的,就没必要再继续往前走了,现在坐下,当前元素就进入了有序序列

插入的每一次插,都不一定要轮一遍有序序列

function insertionSort(arr) {
    //外层循环:拿到标记的元素
    for (let i = 0; i < arr.length; i++) {
        let temp = arr[i];
        //内层循环:从后往前比较元素的大小
        let j = i;
        while (arr[j - 1] > arr[j] && j > 0) {
            arr[j] = arr[j - 1];
            j--;
        }
        //最后便将其插入进去即可
        arr[j] = temp;
    }
    return arr;
}

//测试一下
console.log(insertionSort([1, 3, 2, 6, 4, 5]));

有关数组常用的几种排序方式的更多相关文章

  1. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  6. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  7. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  8. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  9. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  10. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

随机推荐