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]);
} }
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]); }
然后从M[N + 1]开始拿数据与堆顶比较....
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]);
}
}
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]);
}
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);
}
}
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]+" ");}