我正在Python中运行一个选择排序函数,该函数可用于numpy数组而不是列表(因此,我认为我不能使用.pop。)
函数是:
def selectionSort(arr):
newArr = []
for i in range(len(arr)):
smallest = findSmallest(arr)
newArr.append((smallest))
arr = arr[(arr > smallest)]
return newArr
我希望“ arr = arr [(arr> smallest)]显然不起作用,以相同的方式从传递的数组中删除最小值(或附加到newArr的值,即相同的值)该.pop可以处理列表。
我已经尝试过以下方法:
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
index = [2, 3, 6]
new_a = np.delete(a, index)
但是无法正常工作。归根结底,我需要获取以下格式的内容:
arr = randint(0,10,20)
返回以升序排序的数组。我所能管理的就是重复返回最小值。
感谢您的帮助
答案 0 :(得分:0)
尝试
while (want.click == false)
答案 1 :(得分:0)
您可以尝试:
arr = arr[ arr != np.min(a)]
这样,您将从arr
中提取除最小元素之外的所有元素,然后将它们重新分配给arr
。
答案 2 :(得分:0)
您的算法几乎是正确的。的确,如果arr
中没有重复的值,它将起作用:
import numpy as np
def selectionSort(arr):
newArr = []
for i in range(len(arr)):
smallest = findSmallest(arr)
newArr.append((smallest))
arr = arr[(arr > smallest)]
return newArr
findSmallest = np.min
# no duplicate values
auniq = np.random.choice(np.arange(20), (10,), replace=False)
print(auniq)
print(selectionSort(auniq))
样品运行:
[ 0 1 7 4 10 14 13 16 9 12]
[0, 1, 4, 7, 9, 10, 12, 13, 14, 16]
如果存在重复项,则将崩溃,因为在删除具有重复项的最小值时,重复项也将被删除,这会引发循环逻辑。
# duplicate values
adupl = np.random.randint(0, 9, (10,))
print(adupl)
# next line would crash
#print(selectionSort(adupl))
一种解决方法是只删除一份副本。例如,可以使用argmin
来完成,该操作返回最小值的一个索引,而不是其值。
def selectionSort2(arr):
arr = np.array(arr)
sorted = np.empty_like(arr)
for i in range(len(sorted)):
j = arr.argmin()
sorted[i] = arr[j]
arr = np.delete(arr, j)
return sorted
print(selectionSort2(adupl))
这有效,但效率极低,因为np.delete
或多或少是O(n)。用边界元素交换最小元素然后将其切掉会更便宜:
def selectionSort3(arr):
arr = np.array(arr)
sorted = np.empty_like(arr)
for i in range(len(sorted)):
j = arr[i:].argmin()
sorted[i] = arr[i + j]
arr[i], arr[i + j] = arr[i + j], arr[i]
return sorted
print(selectionSort3(adupl))
看看selectionSort3
,我们可以发现实际上并不需要单独的输出sorted
,因为arr
已经被就位了:
def selectionSort4(arr):
arr = np.array(arr)
for i in range(len(arr)):
j = arr[i:].argmin()
arr[i], arr[i + j] = arr[i + j], arr[i]
return arr
print(selectionSort4(adupl))
样本输出(adupl
和selectionSort2-4
的输出):
[0 4 3 8 8 4 5 0 4 2]
[0 0 2 3 4 4 4 5 8 8]
[0 0 2 3 4 4 4 5 8 8]
[0 0 2 3 4 4 4 5 8 8]