mergeSort算法的Python实现

时间:2019-12-17 10:29:16

标签: python mergesort

我遇到了mergeSort算法的以下实现:

def merge_sort(x):
    merge_sort2(x,0,len(x)-1)


def merge_sort2(x,first,last):
    if first < last:
        middle = (first + last) // 2
        merge_sort2(x,first,middle)
        merge_sort2(x,middle+1,last)
        merge(x,first,middle,last)


def merge(x,first,middle,last):
    L = x[first:middle+1]
    R = x[middle+1:last+1]
    L.append(999999999)
    R.append(999999999)
    i=j=0
    for k in range(first,last+1):
        if L[i] <= R[j]:
            x[k] = L[i]
            i += 1
        else:
            x[k] = R[j]
            j += 1


x = [17, 87, 6, 22, 41, 3, 13, 54]
x_sorted = merge_sort(x)
print(x)

我得到了大部分。但是,我不明白合并功能的以下四行:

 L = x[first:middle+1]
    R = x[middle+1:last+1]
    L.append(999999999)
    R.append(999999999)

首先:为什么切片以 middle + 1 结尾?在Python中切片数组包括最后一个元素,对吗?因此,从first:middle切片是否足够?那么, +1 有什么用呢? 其次:为什么我必须将大量数字附加到列表中?为什么没有它就不起作用?没有,我检查了一下。但是我只是不知道为什么。

2 个答案:

答案 0 :(得分:1)

您实际上并不需要https://rosettacode.org/wiki/Sorting_algorithms/Merge_sort#Python中的意大利面条式嵌套函数,只需recur即可

from heapq import merge

def merge_sort(m):
    if len(m) <= 1:
        return m

    middle = len(m) // 2
    left = m[:middle]
    right = m[middle:]

    left = merge_sort(left)
    right = merge_sort(right)
    return list(merge(left, right))

索引不应为+1,因为Python切片在相同索引的情况下不会重叠,即

>>> x = [1,2,3,4,5,6]
>>> middle = 4
>>> x[:middle]
[1, 2, 3, 4]
>>> x[middle:]
[5, 6]

此外,合并的heapq实现要比您可以编写的代码更理想=)

答案 1 :(得分:1)

Q1:在Python中切片数组包括最后一个元素,对吧?

否,类似范围函数Python切片不包含最后一个元素。

import pytest
import time
import json
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
#login
driver = webdriver.Chrome(executable_path=r'C:\chromedriver.exe')
driver.get("url")
#time.sleep(10)
driver.set_window_size(920, 680)
driver.find_element(By.ID, "loginUserName").send_keys("xx")
driver.find_element(By.ID, "loginPassword").send_keys("yy")
driver.find_element(By.ID, "loginButton").click()

第二季度:关于以下代码段。

> a=[1,2,3,4,5]
> a[1:4]
[2, 3, 4]

如果不将这些大数字附加到列表中,则您的合并代码可能与下面的内容有所不同。

 L = x[first:middle+1]
    R = x[middle+1:last+1]
    L.append(999999999)
    R.append(999999999)

正如@Cedced_Bro在评论部分中指出的那样,那些最大的数字用来知道边的一端已经达到。 如果您观察上述代码片段,则如果我们用完一个列表中的数字,则理想情况下将退出for循环,并将其他列表的其余元素插入temp数组(如果有)。

附加这些大数字是避免这两个for循环的明智方法。但这会导致不必要的比较999999999与其他列表中的其余元素的比较。

相关问题