有趣的排序题目链接
度度熊有一个N个数的数组,他想将数组从小到大 排好序,但是萌萌的度度熊只会下面这个操作:
任取数组中的一个数然后将它放置在数组的最后一个位置。
问最少操作多少次可以使得数组从小到大有序?
输入描述:
首先输入一个正整数N,接下来的一行输入N个整数。(N <= 50, 每个数的绝对值小于等于1000)
输出描述:
输出一个整数表示最少的操作次数。
输入例子1:
4 19 7 8 25
输出例子1:
2思路:整体思路是将未排序的元素依次按照从小到大的顺序放置到数组的最后。关键在于什么是未排序的元素?
例如:19 7 8 25 排序是 7 8 19 25,那么从排序好的第一个元素7开始,原数组中已排好的是7 8,未排序的是19 25。
原始输入的数组a,通过排序得到新的数组b。通过二者的动态比较可以得到:a中按大小顺序已经站好位置的元素的个数,即元素移动中,不需要移动就可以归位的元素,那么剩下的元素个数就是必须经过移动才能归位的元素,即最小的移动次数。按照这个思路,除了不需要动的元素以外,如果每次按照剩余元素从小到大的顺序依次取出,并放到数组的末尾的方法,就是最小移动次数的方法。
package test;
import java.util.Arrays;
import java.util.Scanner;
/**
* @author xxh
* @date 创建时间:Aug 21, 2017 4:04:44 PM
*/
public class SortOfMoveToTail {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int arr[]=new int[n];
for(int i=0;i<n;i++)
arr[i]=sc.nextInt();
System.out.println(leastOfMoveTime(arr));
}
public static int leastOfMoveTime(int arr[])
{
int res=0;
int n=arr.length;
int oldArr[]=new int[n];
for(int i=0;i<n;i++)
oldArr[i]=arr[i];//保存原数组
Arrays.sort(arr);//原数组排序
for(int i=0;i<n;i++)
{
if(oldArr[i]==arr[res])
res++;
}
return n-res;
}
}