有 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
思路
分析最少次数的交换过程,类似于排序。要实现最小次数交换,按照选择排序的思想交换就是最小次数。
代码
import java.util.Scanner;
public class Ad2 {
static int N;
static int[] arr;
static int right;
static int left = 1;
private static int ans;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
if (scanner.hasNextInt()) {
N = scanner.nextInt();
arr = new int[N + 1];
right = arr.length - 1;
for (int i ; i < arr.length; i++) {
arr[i] = scanner.nextInt();
}
(left <= N) {
;
( left + ; i < arr.length; i++) {
(arr[i] < arr[left]) {
maxindex = Math.max(maxindex, i);
}
}
(maxindex != ) {
swap(maxindex, left);
}
left++;
}
System.out.println(ans);
( ; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
}
{
arr[i];
arr[i] = arr[k];
arr[k] = temp;
ans++;
}
}

