java - 算法 - 百度算法题:有趣的排序
度度熊有一个N个数的数组,他想将数组从小到大 排好序,但是萌萌的度度熊只会下面这个操作:
任取数组中的一个数然后将它放置在数组的最后一个位置。
问最少操作多少次可以使得数组从小到大有序?
输入描述:
首先输入一个正整数N,接下来的一行输入N个整数。(N <= 50, 每个数的绝对值小于等于1000)
输出描述:
输出一个整数表示最少的操作次数。
输入例子1:
4 19 7 8 25
输出例子1:
2
思路:取第一个数,如果它不是当前最小数字,说明它需要放到最后以完成最后的排序,而它后移以后,比他大的肯定都要至少后移一次才能排在它的后面。
所以它和比他大的数字都需要至少移动一次,计数,删除这些数。重复此过程直到不需要排序(剩余的数字都是有序的或者剩余数字数量小于2)为止。
import sun.reflect.generics.tree.Tree; import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); ArrayList<Integer> al = new ArrayList(); int[] counter = new int[1]; counter[0] = 0; for (int i = 0; i < num; i++) { al.add(sc.nextInt()); } TreeSet<Integer> ts = new TreeSet(al); ArrayList<Integer> orderAl = new ArrayList(ts); count(al, orderAl, counter); System.out.println(counter[0]); } public static void count(ArrayList<Integer> al, ArrayList<Integer> orderAl, int[] counter){ boolean stop = true; for(int i = 0; i < al.size(); i++){ if(al.get(i) != orderAl.get(i)){ int currentNum = al.get(i); int jj = al.size(); for(int j = 0; j < jj; j++){ int removeNum = al.get(j); if(removeNum >= currentNum){ al.remove(new Integer(removeNum)); orderAl.remove(new Integer(removeNum)); counter[0] = counter[0] + 1; j--; jj--; } } stop = false; break; } } if(stop != true && al.size() > 1) { count(al, orderAl, counter); } } }