题目描述:度度熊有一个N个数的数组,他想将数组从
小到大 排好序,但是萌萌的度度熊只会下面这个操作:
任取数组中的一个数然后将它放置在数组的最后一个位置。
问最少操作多少次可以使得数组从小到大有序?
任取数组中的一个数然后将它放置在数组的最后一个位置。
问最少操作多少次可以使得数组从小到大有序?
输入描述:
首先输入一个正整数N,接下来的一行输入N个整数。(N <= 50, 每个数的绝对值小于等于1000)
输出描述:
输出一个整数表示最少的操作次数。
输入例子1:
4 19 7 8 25
输出例子1:
2
直接来代码吧
import java.util.ArrayList;
import java.util.Scanner;
public class test3and4_1
{
/*
* 算法思路: 1)找出链表里的最小数min; 2)找出比min大且最接近min的数min2
* 3)判断min2的位置,如在min前,进入第四步,如在min后,将min2改为min,重回第二步 4)将min2置于最后一个位置
* 5)从前面一次检测,找到比min2大且最接近min2的数min3,将min3改为min2,重回第四步
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int i = 0;
int n = input.nextInt();
ArrayList<Integer> list = new ArrayList<Integer>();
for (i = 0; i < n; i++)
{
list.add(input.nextInt());
}
int temp = 0;
int sum = 0;
int j = 0;
int k = 0;
int k2 = -1;
int m = 0;
// 第一步:找出最小的数
temp = list.get(0);
k = 0;// 假设第一个位置的数是最小的
for (i = 1; i < list.size(); i++)
{
if (list.get(i) < temp)
{
temp = list.get(i);
k = i;
}
}
//System.out.println("temp="+temp+"and i ="+k);//k的位置很重要,下面循环不用k
// 第二三步
// 2)找出比min大且最接近min的数min2
// 3)判断min2的位置,如在min前,进入第四步,如在min后,将min2改为min,重回第二步
int sign = 1;// 标志变量
while (true)
{
temp = 1000000000;// 很大的一个数
for (i = 0; i < list.size(); i++)
{
if ((list.get(i) - list.get(k)) < temp
&& (list.get(i) - list.get(k)) > 0)
{
temp = list.get(i) - list.get(k);
k2 = i;// k2记录比min大且最小的数的位置
}
}
//
if (k2 < k)
{
break;
} else
{
sign++;
k = k2;
}
if (sign == n)
{// 为了防止已给序列本来就是按序的,循环出不来
sum = 0;
break;
}
}
// 第四五步
// 4)将min2置于最后一个位置
// 5)从前面一次检测,找到比min2大且最接近min2的数min3,将min3改为min2,重回第四步*/
if (sign != n)// 如果不是刚好全部是按序的话,那肯定得调换
{
while (true)
{
temp = list.get(k2);
list.remove(k2);
list.add(temp);
sum++;
temp = 10000000;
for (i = 0; i < list.size() - 1; i++)
{// 从头开始遍历,找出大于min2且最接近min2的数,当然与min2不需要比较
if ((list.get(i) - list.get(list.size() - 1)) < temp
&& (list.get(i) - list.get(list.size() - 1)) > 0)
{
temp = list.get(i) - list.get(list.size() - 1);
k2 = i;// 用k2记录这个数的位置
}
}
if (temp == 10000000)
{// 如果temp还是这个值得话,说明找不到比最后一个数还小的数,就可以退出循环了
break;
}
}
}
System.out.println(sum);
}
}