Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何使用相邻元素的最小交换对数组进行排序_Algorithm_Sorting_Mergesort - Fatal编程技术网

Algorithm 如何使用相邻元素的最小交换对数组进行排序

Algorithm 如何使用相邻元素的最小交换对数组进行排序,algorithm,sorting,mergesort,Algorithm,Sorting,Mergesort,我有一个算法来解决这个问题,教授必须根据学生的课堂成绩对学生进行排序,如1为好,0为坏。交换次数最少,只有相邻的学生可以交换。例如,如果学生按顺序[0,1,0,1]给出,则只需进行一次交换[0,0,1,1],或者在[0,0,0,0,1,1,1]的情况下,不需要交换 从问题描述中,我立即知道这是一个典型的最小相邻交换问题或计数反转问题,我们可以在合并排序中找到它。我尝试了我自己的算法以及列出的算法,但没有一个通过所有测试 当我尝试按相反顺序对数组排序时,通过的测试用例最多。我还尝试根据数组的第一个

我有一个算法来解决这个问题,教授必须根据学生的课堂成绩对学生进行排序,如1为好,0为坏。交换次数最少,只有相邻的学生可以交换。例如,如果学生按顺序[0,1,0,1]给出,则只需进行一次交换[0,0,1,1],或者在[0,0,0,0,1,1,1]的情况下,不需要交换

从问题描述中,我立即知道这是一个典型的最小相邻交换问题或计数反转问题,我们可以在合并排序中找到它。我尝试了我自己的算法以及列出的算法,但没有一个通过所有测试


当我尝试按相反顺序对数组排序时,通过的测试用例最多。我还尝试根据数组的第一个元素是0还是1来对数组进行排序。例如,如果第一个元素是1,那么我应该按照降序对数组进行排序,或者按照升序对数组进行排序,因为学生可以在任何分组中,但仍然没有一个有效。有些测试用例总是失败。问题是,当我按升序排序时,一个测试用例在反向排序时失败,它与其他一些(但不是全部)一起通过。所以我不知道我做错了什么。

我觉得术语排序对于0和1的数组来说是一种夸张。您可以简单地计算On中的0和1,并生成输出

为了解决最小交换部分,我构建了一个玩具示例;我想到了两个主意。所以,举个例子。我们把学生分为a…f:

a b c d e f
0 1 0 0 1 1

a c d b e f
0 0 0 1 1 1
如你所见,这里没有太多的分类。三个0,三个1

首先,我认为这是一个问题。即。您需要仅使用交换操作将abcdef转换为acdbef。但是,您首先是如何想到acdbef的呢?我的假设是,您只需要将0和1拖动到数组的对边,而不会干扰它们的顺序。例如

        A     B     C     D
0 0 ... 0 ... 1 ... 0 ... 1 ... 1 1

0 0 0 0         ...         1 1 1 1
    A C                     B D
我不能100%确定它是否有效,是否真的能产生最小的互换。但这似乎是合理的——你为什么还要花更多的钱来交换e。GA和C

关于应该将0放在第一位还是最后一位,我认为运行相同的算法两次并比较交换量没有问题


关于如何找到交换的数量,甚至交换的顺序,从编辑距离的角度思考可以帮助您解决后者。找到互换的数量也是编辑距离的一种简化形式。或者更简单的事情——e。G找到离其群集最近的0或1,并将其移动。然后重复,直到数组被排序。

如果我们必须先对0进行排序,然后再对1进行排序,这将是一个简单的反转计数

def count(lst):
    total = 0
    ones = 0
    for x in lst:
        if x:
            ones += 1
        else:
            total += ones
    return total

由于将1排序在0之前也是一个选项,我们只需要运行此算法两次,一次交换0和1的角色,并取最小值。

所有数组元素都是0还是1?没有其他值?可能问题没有解决特定的顺序,您必须选择-0011或1100更好?请共享在所有测试中均未通过的测试中使用的测试tests@GPS是的,所有元素都是0或1,没有其他值。不,我没有失败的测试用例。它对我是隐藏的。这正是为什么我很难找出哪里出了问题。@MBo 0011或1100都可以,这取决于哪一个有最小掉期。这就是我尝试按asc/desc顺序排序的原因。你能分享一下背后的逻辑吗?看起来它只是计算了一个,但没有考虑到最小互换。@DashingBoy每对位置,其中第一个位置有1,第二个位置有0表示一次互换。我们扫描阵列,跟踪扫描了多少阵列。每次我们达到零,我们就把这个数字加到总数上。我喜欢这个结果是多么微小。我想在我的答案和这个算法之间架起一座桥梁是可能的。当然会遗漏几个步骤,但按一个数递增total几乎等同于将一个数组的一端分组。它适用于交换为0的[0,0,1,1],但在序列为[1,1,0,0]时返回4,而在这两种情况下都应返回0,因为不需要交换。@DashingBoy编辑了我的答案。我们必须运行它两次,一次按原样运行,一次使用if交换的分支,然后取最小值。这不是很像合并排序中的交换/反转吗?我的意思是,根据我对合并排序的理解,这就是它对数组进行排序的方法。“我知道我只有0分和1分,但它仍然基本上是分类的。”大兴男孩,是的。我想说,这更像是一个冒泡排序交换,而不是合并排序合并。我在回答中所做的基本上是利用数组值被限制为0和1这一事实,以便不进行任何排序,并可能带来从Onlogn到On的复杂性。