用 Python 编写程序,用于查找对数组元素进行排序所需的预期洗牌次数
pythonserver side programmingprogramming更新于 2026/2/1 11:56:17
假设我们有一组元素 nums。我们必须按非递减顺序对它们进行排序。但排序技术是随机的。我们将检查数组是否已排序,如果没有,则随机洗牌并再次检查。继续此过程,直到所有元素都已排序。在这种情况下,我们必须找到对它们进行排序所需的预期洗牌次数。显示精确到小数点后 6 位的答案。
因此,如果输入为 nums = [5,2,7],则输出将为 6,因为有 3 种可能的排列,因此概率为 1/3
- 如果我们在 i = 1 次迭代时获得排序数组,则需要 1/3
- 如果我们在 i = 2 次迭代时获得排序数组,则需要 (2/3)*(1/3)
如果我们在第 i 次迭代时获得排序数组,则需要 (2/3)^(i-1) * (1/3)
要解决这个问题,我们将遵循以下步骤 −
- 如果 nums 已排序,则
- 返回0
- 否则,
- m:= 一个新的字典,最初为空
- 对于 nums 中的每个 i,执行
- 如果 i 存在于 m 中,则
- m[i] := m[i] + 1
- 否则,
- m[i]:= 1
- 如果 i 存在于 m 中,则
- num:= 1
- 对于 m 中的每个键 i,执行
- num := num * factorial(m[i])
- den:= factorial(nums 的大小)
- 返回 (den/num) 并向上舍入精确到小数点后 6 位
示例
让我们看看下面的实现以便更好地理解 −
from math import factorial
def solve(nums):
if nums == sorted(nums):
return 0
else:
m={}
for i in nums:
if i in m:
m[i]+=1
else:
m[i]=1
num=1
for i in m:
num *= factorial(m[i])
den=factorial(len(nums))
return round((den/num),6)
nums = [5,2,7]
print(solve(nums))
输入
[5,2,7]
输出
6.0
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

