我被算法困住了,我不确定为什么输出不符合预期。我想设计一个不对列表进行切片的合并排序算法。我的想法是使用开始和结束索引来模拟切片列表。我可以获取有关此错误的帮助吗? 非常感谢!
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]
答案 0 :(得分:0)
一些问题:
首先,引用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]
之外更改任何内容。
但是,仍然会覆盖start:end
中您仍然需要的值。例如,第一个alist
循环的第一次迭代(while
和i
均为零)。假设j
,所以alist[start + i] > alist[start + mid + j]
块开始了。您可以执行以下操作:
else
现在意识到alist[start + k] = alist[start + mid + j]
和alist[start + k]
都引用相同的值,因此此赋值破坏了alist[start + i]
循环的下一次迭代中所需的值。它是永远丢失的。
您确实需要额外的存储空间才能通过列表进行管理。
一种方法是使用临时列表来收集合并的值。您将不再需要while
索引,因为您只需将值追加到此新列表中即可。填充完毕后,您可以将其值重新插入k
中。
最后,alist
条件假定要合并的两个半均具有相同的大小,但这是不正确的。 while
可能是奇数,然后下半部分又增加了一个元素。因此,在这种情况下,end - start
会错过最后一次迭代。
对于这个问题,我建议不要使用像当前while i < mid and j < end
那样的 relative 大小或 relative 偏移量的变量,而只使用绝对偏移量。 / p>
以下是解决上述问题的相关代码:
mid