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);
        }
    }



}

 

posted @ 2020-02-02 10:01  不咬人的兔子  阅读(401)  评论(0编辑  收藏  举报