没有切片列表的MergeSort

时间:2019-09-10 15:08:59

标签: python algorithm

我被算法困住了,我不确定为什么输出不符合预期。我想设计一个不对列表进行切片的合并排序算法。我的想法是使用开始和结束索引来模拟切片列表。我可以获取有关此错误的帮助吗? 非常感谢!

def mergeSort(alist, start, end):
    print("Splitting ",alist[start:end])
    length = end - start
    if length >1:
        mid = length//2
        lefthalf = alist[:mid]
        righthalf = alist[mid:]

        mergeSort(alist, start, start + mid)
        mergeSort(alist, start + mid, end)


        i=0
        j=0
        k=0
        while i < mid and j < mid:
            if alist[start + i] <= alist[start + mid + j]:
                alist[k]=alist[start + i]
                i=i+1
            else:
                alist[k]=alist[start + mid + j]
                j=j+1
            k=k+1

        while i < mid:
            alist[k]=alist[start + i]
            i=i+1
            k=k+1

        while j < mid:
            alist[k]=alist[start + mid + j]
            j=j+1
            k=k+1
    print("Merging ",alist[start:end])

当我尝试:

alist = [54,26,93,17,77,31,44,55,20]
mergeSort(alist,0, len(alist))

我知道了

[44, 55, 77, 31, 77, 31, 44, 55, 20]

1 个答案:

答案 0 :(得分:0)

一些问题:

  1. 首先,引用Microsoft Windows [Version 6.0.6001] Copyright (c) 2006 Microsoft Corporation. All rights reserved. C:\Users\Administrator>sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Wed Sep 11 15:21:30 2019 Copyright (c) 1982, 2010, Oracle. All rights reserved. Connected to an idle instance. SQL> startup upgrade ORACLE instance started. Total System Global Area 430075904 bytes Fixed Size 2176448 bytes Variable Size 356518464 bytes Database Buffers 67108864 bytes Redo Buffers 4272128 bytes Database mounted. ORA-01092: ORACLE instance terminated. Disconnection forced ORA-00600: internal error code, arguments: [4194], [], [], [], [], [], [], [], [], [], [], [] Process ID: 5044 Session ID: 1 Serial number: 5 SQL> conn Enter user-name: delhipilot Enter password: ERROR: ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist Process ID: 0 Session ID: 0 Serial number: 0 SQL> 没有意义。如果它是alist[k],那会更有意义,因为您真的不想在窗口alist[start + k]之外更改任何内容。

  2. 但是,仍然会覆盖start:end中您仍然需要的值。例如,第一个alist循环的第一次迭代(whilei均为零)。假设j,所以alist[start + i] > alist[start + mid + j]块开始了。您可以执行以下操作:

    else

    现在意识到alist[start + k] = alist[start + mid + j] alist[start + k]都引用相同的值,因此此赋值破坏了alist[start + i]循环的下一次迭代中所需的值。它是永远丢失的。

    您确实需要额外的存储空间才能通过列表进行管理。

    一种方法是使用临时列表来收集合并的值。您将不再需要while索引,因为您只需将值追加到此新列表中即可。填充完毕后,您可以将其值重新插入k中。

  3. 最后,alist条件假定要合并的两个半均具有相同的大小,但这是不正确的。 while可能是奇数,然后下半部分又增加了一个元素。因此,在这种情况下,end - start会错过最后一次迭代。

    对于这个问题,我建议不要使用像当前while i < mid and j < end那样的 relative 大小或 relative 偏移量的变量,而只使用绝对偏移量。 / p>

以下是解决上述问题的相关代码:

mid