交换瓶子:最少交换次数排序算法
交换瓶子:最少交换次数排序算法
问题描述: 有N个瓶子,编号 1 ~ N,放在架子上。比如有5个瓶子:'2 1 3 5 4'。要求:每次拿起2个瓶子,交换它们的位置。经过若干次后,使得瓶子的序号为:'1 2 3 4 5'
对于这么简单的情况,显然,至少需要交换2次就可以复位。如果瓶子更多呢?你可以通过编程解决,交互次数最少的解决方案为最优方案。
约定: 输入格式为两行: 第一行: 一个正整数N(N<10000), 表示瓶子的数目 第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。 输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。
测试示例 例如,输入:
5
3 1 2 5 4
程序应该输出:
3
再例如,输入:
5
5 4 3 2 1
程序应该输出:
2
解决方案: 一种解决方案是使用冒泡排序的思想。每次从左到右遍历瓶子,如果当前瓶子的编号不等于它应该在的位置,则将它与它应该在的位置上的瓶子交换位置。这样,每次遍历都能将一个瓶子放到它应该在的位置上。重复这个过程直到所有的瓶子都在正确的位置上。
代码实现:
N = int(input()) # 输入瓶子的数目
bottles = list(map(int, input().split())) # 输入瓶子的排列情况
count = 0 # 记录交换次数
for i in range(N):
while bottles[i] != i + 1: # 当前瓶子不在正确的位置上
temp = bottles[i] # 交换当前瓶子和它应该在的位置上的瓶子
bottles[i] = bottles[temp - 1]
bottles[temp - 1] = temp
count += 1
print(count)
输入示例:
5
3 1 2 5 4
输出示例:
3
输入示例:
5
5 4 3 2 1
输出示例:
2
原文地址: https://www.cveoy.top/t/topic/dSLa 著作权归作者所有。请勿转载和采集!