给你一个数组,例如:
arr = [['AB','KR','EH'],['EE','DD','PS'],['GH','LM','XK']]
然后,通过一个函数,你要得到这个:
数组必须作为一个整体升序排序,而不仅仅是按行排序。您不能为此创建新数组。你必须到位。
我试图找到一种不使用新数组来做到这一点的方法,但我做不到。 这是我的代码,它当然对数组进行排序但创建一个新数组。
def sortArray(arr): #n : filas,columnas
sorted_arr = []
for j in arr:
sorted_arr.extend(j)
return sorted(sorted_arr)
尝试:
from itertools import islice
arr = [["AB", "KR", "EH"], ["EE", "DD", "PS"], ["GH", "LM", "XK"]]
i = iter(sorted(v for l in arr for v in l))
for l in arr:
l[:] = islice(i, 0, len(l))
print(arr)
印花:
[
["AB", "DD", "EE"],
["EH", "GH", "KR"],
["LM", "PS", "XK"]
]
您可以使用从 0 到
N * N - 1
的索引执行选择排序,其中 N
是数组的长度(因为它是正方形)。每个索引在实际数组中对应的元素可以通过除法取余来计算。
def sortArray(arr):
n = len(arr)
for i in range(n * n):
m = i
for j in range(i + 1, n * n):
if arr[j // n][j % n] < arr[m // n][m % n]:
m = j
arr[i // n][i % n], arr[m // n][m % n] = arr[m // n][m % n], arr[i // n][i % n]
好吧,如果您不能创建新列表并且必须就地完成,您可以随时进行交换排序:
arr = [['AB','KR','EH'],['EE','DD','PS'],['GH','LM','XK']]
def sortedArray(arr):
height = len(arr)
width = len(arr[0])
for left in range(height*width):
for right in range(left+1, height*width):
li, lj = left//height, left%width
ri, rj = right//height, right%width
if arr[li][lj] > arr[ri][rj]:
arr[li][lj], arr[ri][rj] = arr[ri][rj], arr[li][lj]
return arr
print(sortedArray(arr))
输出:
[
['AB', 'DD', 'EE'],
['EH', 'GH', 'KR'],
['LM', 'PS', 'XK']
]
看起来很乱,感觉很呆板,但至少符合要求
(结果基于他们的评论,即与错误图像中显示的不完全一样。他们说它总是正方形。)
a = [['AB','KR','EH'],['EE','DD','PS'],['GH','LM','XK']]
r = range(len(a))
for i in r:
for j in r:
for I in r:
for J in r:
if a[i][j] < a[I][J]:
a[i][j], a[I][J] = a[I][J], a[i][j]
print(a)
输出(在线尝试!):
[['AB', 'DD', 'EE'], ['EH', 'GH', 'KR'], ['LM', 'PS', 'XK']]
真的很普通。只是一维插入排序。但是在转换索引并获取/设置二维原始值的对象上:
def insertionSort(A):
for i, a in enumerate(A):
while i and a < A[i-1]:
A[i] = A[i-1]
i -= 1
A[i] = a
def sortArray(A):
class B:
def __getitem__(_, i):
return A[i//n][i%n]
def __setitem__(_, i, value):
A[i//n][i%n] = value
n = len(A)
insertionSort(B())
return A
arr = [['AB','KR','EH'],['EE','DD','PS'],['GH','LM','XK']]
print(sortArray(arr))
def sortArray(arr):
n = len(arr)
for i in range(n * n):
m = i
for j in range(i + 1, n * n):
if arr[j // n][j % n] < arr[m // n][m % n]:
m = j
arr[i // n][i % n], arr[m // n][m % n] = arr[m // n][m % n], arr[i // n][i % n]