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
Python 优化代码以减少交换次数_Python_Sorting - Fatal编程技术网

Python 优化代码以减少交换次数

Python 优化代码以减少交换次数,python,sorting,Python,Sorting,您将得到一个无序数组,该数组由连续的整数组成,没有任何重复项。您可以交换任意两个元素。您需要找到按升序排序数组所需的最小交换次数。我得到的代码,在几个测试用例中超时了。有什么方法可以优化代码吗 我的代码如下: def minimumSwaps(arr): lst=[ele+1 for ele in range(len(arr))] cnt=0 for i in range(len(arr)): if(lst[i]!=arr[i]):

您将得到一个无序数组,该数组由连续的整数组成,没有任何重复项。您可以交换任意两个元素。您需要找到按升序排序数组所需的最小交换次数。我得到的代码,在几个测试用例中超时了。有什么方法可以优化代码吗

我的代码如下:

def minimumSwaps(arr):
    lst=[ele+1 for ele in range(len(arr))]
    cnt=0
    for i in range(len(arr)):
        if(lst[i]!=arr[i]):
            k=arr.index(lst[i])
            arr[i],arr[k]=arr[k],arr[i]
            cnt=cnt+1
    return cnt

您实际上不需要生成参考列表
lst
,因为您应该知道
arr
中的
n
应该在索引
n-1
中才能升序。此外,执行
k=arr.index(lst[i])
需要
O(n)
时间进行搜索,这完全是不必要的。以下是我的解决方案:

def最小互换(arr):
互换总额=0
开始=0
启动时
如果我猜对了,这是一个关于Hackerrank的问题,在通过测试时,这就是我的解决方案P

该算法从位置1开始,将光标下的项目直接交换到正确的位置。将正确的项目交换到此位置时,它会将光标增加到下一个项目并重复此过程


这比按顺序单步遍历数组,将正确的项交换到每个位置更有效,因为您不必计算正确的项在列表尾部的确切位置。

要使用列表上的
O(n)
效率
[1..n]
进行无交换,您最好使用,或者针对这类问题进行了优化的子类型。通常情况下,情况并非如此,并且具有更好的效率(
n log(n)
)(包括交换次数),我认为这两种算法都可以就地运行。连续整数是否还没有按升序排列?请告诉我算法的名称,或者如果没有名称,其思想类似于哪种排序算法?