当前位置: 首页 > 知识库问答 >
问题:

无限交换排序算法

邓欣可
2023-03-14

我想就我在教科书中发现的以下问题得到一些帮助。

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是随机的。

共有1个答案

姬寂离
2023-03-14

ij指的是索引,j总是调整为两者中的较大值。这意味着由索引i指定的元素(表示为x)将位于元素左侧的索引j,表示为y

然后,仅当yx未排序时,才交换元素,这意味着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的无限倍数列表。但现在我想构建一个函数,给定一个返回列表中所有数字的倍数的无限递增列表。所以函数

  • 待排序的元素需要实现 Java 的 Comparable 接口,该接口有 compareTo() 方法,可以用它来判断两个元素的大小关系。 使用辅助函数 less() 和 swap() 来进行比较和交换的操作,使得代码的可读性和可移植性更好。 排序算法的成本模型是比较和交换的次数。 // java public abstract class Sort<t extends="" comparable

  • 我想通过删除已经排序的项目来提高我的算法的效率,但是我不知道如何才能有效地做到这一点。我找到的唯一方法是重写整个列表。

  • 冒泡排序 相邻的两个元素依次比较,小的放在左边。 选择排序 从未排序序列中找到最大(小)值存放到已排序序列末尾。 插入排序 从已排序序列中找到小于或等于当前数的位置并插到其后。 希尔排序 归并排序 归并排序(merge sort)是创建在归并操作上的一种有效的排序算法。归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。 递归方式 此方式