编程:写出M个数中前N个最大数(M>N) 求解??????笔试题求解拜托大家了

解决方案 »

  1.   

    在M[]里找前N个建最小堆。
    然后从M[N + 1]开始拿数据与堆顶比较....
      

  2.   

    public class Test1{
    public static void main(String[] args){
    java.util.Scanner ran=new java.util.Scanner(System.in);
    System.out.println("请输入M");
    int M = ran.nextInt();
    int [] arr1 =new int[M-1];
    System.out.println("请输入M-1个数....");
    for(int i=0;i<M-1;i++){
    arr1[i] = ran.nextInt();
    }
    System.out.println("*************M个数中前N个数的比较***************");
    System.out.println("***********请输入N*************");
    int N=ran.nextInt();
    int j=0;
    int i=0;
    for( i=0,j=1;j<N;j++){
    int p=0;
    if(arr1[i]<arr1[j]){
    p = arr1[j];
    arr1[j]=arr1[i];
    arr1[i]=p;
    }
    }
    System.out.println("************输出前N个数的最大值arr1[i]***************");
    System.out.println("arr1[i] = " + arr1[i]);
     
    }
    }
      

  3.   


    int m[] = new int[]{1,3,2,5,8,6}, n = 3;
    Arrays.sort(m);
    for(int i = m.length -1; i > = m.length-n -1; i++){
        System.out.println(m[i]);
    }
      

  4.   

    http://blog.csdn.net/ada168855/article/details/8792283
      

  5.   

    出题者的意图是这样的:
    1、考你排序,但绝对不允许调用Arrays.sort()和Collections.sort(),否则0分;
    2、考察你对“二叉堆”的理解,这种算法基于筛选法,是顺序结构存储二叉树的一个重要应用。package findAndSort;import org.junit.Test;public class HeapSort {
    /**
     * 用于堆排序的全局变量temp
     */
    private int temp;
    /**
     *调整某个子树
     *分叶子、只有左、有左有右三种情况讨论
     */
    public void oneHeap(int[] array,int index,int max){
    //没有左孩子(即为叶子节点)
    if(2*index+1>max){
    return ;
    }else{
    //只有左孩子
    if(index*2+1==max){
    if(array[index]>array[index*2+1]){
    return;
    }else{
    //父节点比左孩子小,交换;无需再递归
    int leftIndex=index*2+1;
    temp=array[index];
    array[index]=array[leftIndex];
    array[leftIndex]=temp;
    }
    }else{
    //既有左孩子,又有右孩子的情况,筛选出关键字最大的孩子节点,并与父节点交换
    int left=array[index*2+1];
    int right=array[index*2+2];
    if(array[index]>left&&array[index]>right){
    return;
    }else{
    if(left>=right){
    temp=array[index];
    array[index]=left;
    array[index*2+1]=temp;
    //调整之后,为了符合堆的定义、加快下一次筛选速度,最好递归调整左或者右子树。
    //不递归的话并不会影响最终结果
    this.oneHeap(array, index*2+1, max);
    }else{
    temp=array[index];
    array[index]=right;
    array[index*2+2]=temp;
    this.oneHeap(array, index*2+2, max);
    }
    }
    }
    }
    }
    /**
     * 思想:
     * 利用大根堆,执行n趟堆排序,把最大的n个值交换到数组末尾。
     * 算法平均复杂度为 :
     * NLog2(M)
     */
    public void findMax(int[] array,int n){
    int count=1,i=array.length-1;
    while(count<=n){
    for(int j=i/2;j>=0;j--){
    this.oneHeap(array, j, i);
    }
    temp=array[0];
    array[0]=array[i];
    array[i]=temp;
    i--;
    count++;
    }
    i=array.length-1;
    count=1;
    System.out.println("前"+n+"个最大值为:");
    while(count<=n){
    System.out.print(array[i]+"\t");
    i--;
    count++;
    }
    }
    @Test
    public void testHeapSort(){
    int[] array={87,26,45,95,66,-5,78,33,79};
       this.findMax(array, 3);
    }
    }
      

  6.   

    回答“排序”应该会给分的。我的意思是:最好回答完整的“先排序,冒泡、选择、归并等等”来体现自己的思想,但不能直接回答“API的排序”。
      

  7.   

    那要分是什么公司了,如果是百度、新浪、搜狐等等的话,是绝对不允许调用API的(调API小学生都会,考了有意义?);即使调了API,也要问你Arrays.sort()是什么排序,时间效率怎样、空间消耗如何、稳定性如何等等问题。
      

  8.   

    用选择排序最简单吧堆啥的但是写代码多麻烦啊。就这么几行就拿下了
    for(int i=0;i<N;i++)
    {
      for(int j=i;j<i.length;i++)
    {
      int temp = a[i];
      if(a[j]>a[i])
      {
        int temp=a[j];
        a[j]=a[i];
        a[i] =temp;
      }
    }
       System.out.print(a[i]+" ");}