我想就我在教科书中发现的以下问题得到一些帮助。
sort (array[], nr_of_item)
{
while(true)
i:=value from an n-sided fair dice roll
j:=value from an n-sided fair dice roll
if (i > j)
swap i and j
if (array[i] > array [j])
swap array[i] and array[j]
end while
}
现在,它说它没有描述正确的算法。但是他们说:
一段时间后,应该对数组进行排序,并证明如果输入未排序,则对数组进行排序的比较次数为O(n^3)。
另一个问题是:
验证算法是否会在O(n)时间内对数组进行排序
我真的不明白你怎么能证明这一点,因为i和j是随机的。
i
和j
指的是索引,j
总是调整为两者中的较大值。这意味着由索引i
指定的元素(表示为x
)将位于元素左侧的索引j
,表示为y
。
然后,仅当y
和x
未排序时,才交换元素,这意味着x
大于y
,并且根据它们的索引位置,位于y
的左侧,因此是无序的。这保证了函数只会更接近(而不是更远)排序状态。
现在,关于复杂性,想象一下气泡排序,它被设计为在数组中迭代,而不是随机进行选择。这有一个n平方的复杂度。不过,这里还发生了其他事情。你随机选择两个元素,因此n-choose-1倍于冒泡排序的复杂度,变成n次方。
函数的每次调用都会进行两次比较,特别是2次比较。因此,复杂度是n立方乘以2,可以用大O表示法表示为n立方。
我在使用算法,特别是堆排序。根据我的理解,堆排序算法包括首先将列表转换为最大堆来准备列表。 转动我的 [2, 8, 5, 3, 9, 1] [9, 8, 5, 3, 2, 1] 和希普索尔一起,我应该用1交换9。但是通过直接在最大堆之后查看数组,我看到了一个按降序排序的列表。当列表已经按降序排序时,为什么需要交换? 这只是我看了之后的想法:https://www.youtube.com/watch
主要内容:置换选择排序算法的具体实现,总结上一节介绍了增加 k-路 归并排序中的 k 值来提高外部排序效率的方法,而除此之外,还有另外一条路可走,即减少初始归并段的个数,也就是本章第一节中提到的减小 m 的值。 m 的求值方法为:m=⌈n/l⌉(n 表示为外部文件中的记录数,l 表示初始归并段中包含的记录数) 如果要想减小 m 的值,在外部文件总的记录数 n 值一定的情况下,只能增加每个归并段中所包含的记录数 l。而对于初始归并段的形成,
我知道对无限列表进行排序是不可能的,但我正试图为n个数的倍数的无限递增列表写一个定义。 我已经有这个功能了 它返回n的无限倍数列表。但现在我想构建一个函数,给定一个返回列表中所有数字的倍数的无限递增列表。所以函数
要么我一整天都精疲力尽了,不能正常思考,要么这是不可能的,但我想一个原子,它引用一个无限延迟的seq,并使用当前seq的 我的程序挂起有明显的原因,因为在交换前尝试检查以前和新的seq相等。相等性检查基本上从不终止 以前,我的惰性seq是在中工作的,但是在REPL上,由于实现了返回的seq,我的REPL被挂起 无论如何,使用仍然失败
待排序的元素需要实现 Java 的 Comparable 接口,该接口有 compareTo() 方法,可以用它来判断两个元素的大小关系。 使用辅助函数 less() 和 swap() 来进行比较和交换的操作,使得代码的可读性和可移植性更好。 排序算法的成本模型是比较和交换的次数。 // java public abstract class Sort<t extends="" comparable
我想通过删除已经排序的项目来提高我的算法的效率,但是我不知道如何才能有效地做到这一点。我找到的唯一方法是重写整个列表。