繁体   English   中英

Python:修改后的冒泡排序

[英]Python: Modified Bubble Sort

这个程序是用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)。

我将如何修改此代码以满足示例?

您可以通过创建map来做到这一点,其中key是array的值,value是array的索引。 之后,遍历输入列表,并比较当前值和已排序列表中的值。 如果不同:
-增加交换次数
-从地图中获取排序列表的索引map [排序列表]
-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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM