这个程序是用python编写的。它的目标是通过交换将一个不合适的位置移动到适当的位置,然后输出它所采用的交换次数。所以它与冒泡排序非常相似,除了程序不必切换与它相邻的数字。请参阅下面的示例
示例输入:
5 2 4 7 7 3
示例输出:2
示例说明:
24773 - 起始5个整数组
24377 - 交换3为前7(第一次交换)(7不在3的旁边)
23477 - 交换3和4以获得最小到最大的数量(第二次交换)
这是我目前在Python中的代码。它采用传统的冒泡排序方法。
def bubbleSort(alist):
times = 0
for passnum in range(len(alist)-1,0,-1):
for i in range(passnum):
if alist[i]>alist[i+1]:
times = times + 1
temp = alist[i]
alist[i] = alist[i+1]
alist[i+1] = temp
print(alist)
return(times)
arrin = [5, 2, 4, 7, 7, 3]
print(bubbleSort(arrin))
输出:3
这个答案是不正确的,因为冒泡排序将3与相邻的7交换,将输出增加到3(应为2)。
如何修改此代码以满足示例?
答案 0 :(得分:1)
您可以通过创建map来实现,其中key是数组的值,value是数组的索引。之后,循环输入列表,并比较排序列表中的当前值和值。如果不同:
- 增加掉期数量
-get从映射中排序列表的索引,映射[sorted list]
-in输入列表交换当前值与排序当前值
更新地图[当前列表值] =地图[已排序的当前列表值]
这需要在输入列表和反向输入列表上执行。无论哪个更小都是答案。
def bubbleSort(alist):
m = {}
for i in range(len(alist)):
m[alist[i]] = i
sorted_alist = sorted(alist)
times = 0
for i in range(len(alist)):
if alist[i] != sorted_alist[i]:
times +=1
ind_to_swap = m[ sorted_alist[i] ]
m[ alist[i] ] = m[ sorted_alist[i]]
alist[i],alist[ind_to_swap] = sorted_alist[i],alist[i]
return times
arrin = [2, 4, 7, 7, 3]
asc=bubbleSort(arrin)
desc=bubbleSort(list(reversed(arrin)))
print (min(asc,desc))