栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

给定目标索引数组,如何就地对数组进行排序?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

给定目标索引数组,如何就地对数组进行排序?

该算法失败,因为它在列表的索引上只有一个循环。

您的算法中发生的事情是这样的:

i=0 -> ["A", "B", "C", "D"] , [ 2,   3,   1,   0 ]i=1 -> ["C", "B", "A", "D"] , [ 1,   3,   2,   0 ]i=2 -> ["C", "D", "A", "B"] , [ 1,   0,   2,   3 ]i=3 -> ["C", "D", "A", "B"] , [ 1,   0,   2,   3 ]

请注意,第一次交换

1
是如何进行的,
0
除非您与交换,否则将不会再次访问它
0
,在此示例中不会发生这种情况。

您的算法错过的是一个内部循环,该内部循环贯穿索引的子循环。尝试更换

if
while
rearrange

function rearrange(arr, ind) {   for (var i = 0, len = arr.length; i < len; i++) {      while (ind[i] !== i) {         swap(arr, i, ind[i]);         swap(ind, i, ind[i]);      }   }}

关于复杂性的注意事项
:尽管这是一个双循环,但复杂度不会改变,因为在每次交换时,一个元素都被正确放置,并且每个元素最多读取两次(一次循环,一次通过for循环)。

证明注意事项
:在这里,我不会对此算法做完整的证明,但是我可以提供线索。如果

ind
是一个排列,则所有元素都属于封闭的排列子循环。该
while
循环确保你遍历整个周期的
for
循环确保你检查每一个可能的周期。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370579.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号