【习题三】数组练习题
1、定义一个数组来存储12个学生的成绩{72,89,65,58,87,91,53,82,71,93,76,68},计算并输出学生的平均成绩。
package t3; public class TestArray1{ public static void main(String[]args){ int []a={72,89,65,58,87,91,53,82,71,93,76,68};//显示初始化数组a,将学生成绩存到数组 double sum;//为了平均成绩的精确,定义成绩的和为double类型 sum=0; for(int i=0;i<a.length;i++){ sum=sum+a[i]; } System.out.println("学生成绩的平均数是:"+sum/a.length);//打印平均成绩 } }
2、定义一个数组来存储12个学生的成绩{72,89,65,58,87,91,53,82,71,93,76,68},统计各成绩等级(90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为E)学生人数,并将其放入到数组count中,其中:count[0]存E级的人数,count[1]存D级的人数,……,count[4]存A级的人数。
//90以上 count[4]++
//80~89 count[3]++
//70~79 count[2]++
//60~69 count[1]++
//60以下 count[0]++
package t3; public class TestArray2{ public static void main(String[]args){ int []a={72,89,65,58,87,91,53,82,71,93,76,68};//显示初始化数组a,将学生成绩存到数组 int []count=new int[5];//定义一个数组存储成绩每等级个数 for(int i=0;i<a.length;i++){//遍历数组a if(a[i]>=90){//if else语句分级,并将个数存到对应空间中 count[4]++; }else if(a[i]>=80){ count[3]++; }else if(a[i]>=70){ count[2]++; }else if(a[i]>=60){ count[1]++; }else{ count[0]++; } /* if(score[i]>=60){//归纳出简便方法 count[score[i]/10-5]++; }else{ count[0]++; } */ } System.out.print("A等级\tB等级\tC等级\tD等级\tE等级\t"); System.out.println(); for(int j=count.length-1;j>=0;j--){//从后往前遍历count System.out.print(" "+count[j]+"\t"); } } }
3、从键盘输入8个整数存放在一个数组中,然后将奇数和偶数分别存入到两个不同的数组中,并按奇数、偶数交替的顺序输出这两个数组中的所有数据(先交替输出,如果奇数个数多,则再输出剩下的奇数,如果偶数个数多,则再输出剩下的偶数)。(提示与要求:(1)定义一个数组存储从键盘输入的8个整数,先判断这8个整数中奇数和偶数的个数,才能定义存储奇数和偶数的数组的长度;(2)把一个大的数组分别存放在奇数和偶数数组中并交替输出的过程定义为方法)
package t3; import java.util.Scanner; public class TestArray3{ public static void main(String []args){ Scanner sc=new Scanner(System.in);//读入数据 int a[]=new int[8]; System.out.print("请输入8个数:"); for(int i=0;i<a.length;i++){ a[i]=sc.nextInt(); } Array(a); //调用函数Array() } public static void Array(int[]num){ int []oddNum;//奇数数组 int []evenNum;//偶数数组 int evenCount=0; int oddCount=0; for (int i = 0; i < num.length; i++) { if(num[i]%2==0){ evenCount++; }else{ oddCount++; } }//循环结束已经统计出了num数组中偶数的个数为evenCount,奇数的个数为oddCount oddNum=new int[oddCount]; evenNum=new int[evenCount]; int e=0,o=0; for (int i = 0; i < num.length; i++){ if(num[i]%2==0){ evenNum[e]=num[i]; e++; }else{ oddNum[o]=num[i]; o++; } }//此时已经将数组num按照奇数、偶数分拣到两个数组oddNum,evenNum中 if(evenNum.length>oddNum.length){//如果偶数个数较多 for(int i=0;i<=oddNum.length-1;i++){ System.out.print(oddNum[i]+" "+evenNum[i]+" "); }//先按照奇数的个数交替输出 for(int i=oddNum.length;i<=evenNum.length-1;i++){ System.out.print(evenNum[i]+" "); }//输出剩下的偶数 }else{ for(int i=0;i<=evenNum.length-1;i++){ System.out.print(oddNum[i]+" "+evenNum[i]+" "); }//先按照偶数的个数交替输出 for(int i=evenNum.length;i<=oddNum.length-1;i++){ System.out.print(oddNum[i]+" "); }//输出剩下的奇数 } } }
4、实现如下的排序算法:有一种简单的排序方法叫计数排序法,这种排序算法对一个待排序的数组进行排序,并将排序结果放到另一个新的数组中。计数排序算法针对待排序数组中的每个数据,扫描待排序的数组一趟,统计待排序数组中有多少个数据的值比该数据的值小。假设针对某一个记录,统计出的计数值为c,那么,这个记录在新的有序数组中的合适的存放位置即为c。
程序框架如下,补充完整:
public class CountSort
{
public static void countSort(int n[])//对数组n进行计数排序的方法
{
int m[]=new int[n.length];//定义排序后的数组m
int count[]=new int[n.length];//记录数组n中某个数据在数组m中的位置
/*
*/
……………………..
………………………
………………………
…………………….
for(int i=0;i<m.length;i++)//输出排序后的数组
{
System.out.print(m[i]+" ");
}
System.out.println();
}
public static void main(String[] args)
{
int a[]={7,4,0,6,2,5,1};
CountSort.countSort(a);
}
}
package t3; public class CountSort { public static int[] countSort(int a[]){ int m[]=new int[a.length];//数组m用来存放有序的数据序列 int count[]=new int[a.length];//数组count用来存放比数组a中每个元素小的数据的个数,count[0]存放比a[0]小的数据的个数,count[1]存放比a[1]小的数据的个数... /* for(int i=0;i<=a.length-1;i++){ for(int j=0;j<=a.length-1;j++){ if(j!=i&&a[j]<a[i]){ count[i]++; } } } */ for(int i=0;i<=a.length-1;i++){ for(int j=i+1;j<=a.length-1;j++){ if(a[j]<=a[i]){ count[i]++; }else{ count[j]++; } } } /* for (int i = 0; i < count.length; i++) { System.out.print(count[i]+" "); } System.out.println(); */ for (int i = 0; i < count.length; i++) { m[count[i]]=a[i]; } return m; } public static void main(String[] args) { int num[]={7,4,0,6,2,5,1}; int sortNum[]=countSort(num); System.out.println("排好序的数组为:"); for (int i = 0; i < sortNum.length; i++) { System.out.print(sortNum[i]+" "); } } }
5、编写顺序查找的方法public static int[] ordinalSearch(int data[],int key),要求该方法返回一个数组(如果key存在,数组中各元素的值分别为关键字key在原数组data中的各下标;如果key不存在,则返回一个长度为1的数组,数组元素为-1)。【基本过程:(1)先扫描数组data,统计数组中key的个数n;(2)如果n为0,直接返回一个数组元素为-1的数组;否则的话定义一个数组int index[]=new int[n],再扫描数组data,把数组中值为key的各个元素的下标保存到数组index中,最后返回数组index】
package t3; public class TestArray5 { public static int[] ordinalSearch(int data[],int key){ int n=0; for (int i = 0; i < data.length; i++) { if(data[i]==key){ n++; } }//已经知道数组data中有n个key if(n==0){ int index[]={-1}; return index; }else{ int index[]=new int[n]; int j=0; for (int i = 0; i < data.length; i++) { if(data[i]==key){ index[j]=i; j++; } }//把key存在于数组data中的各下标存入数组index return index; } } public static void main(String[] args) { int a[]={7,4,0,6,2,5,1,1,6,0,6,7}; int index[]=ordinalSearch(a, 6); for (int i = 0; i < index.length; i++) { System.out.print(index[i]+" "); } } }
6、编写一个方法public static int[][] dyadicArraySort(int a[][]),能够实现对一个二维数组a进行升序排列,要求整个二维数组中最小的值为a[0][0],然后依次是a[0][1],a[0][2]….,a[1][0],a[1][1]…..,使用一个无序的二维数组对你编写的方法进行检验。(基本思想:在方法体中,先将二维数组转换为一个一维数组,然后对一维数组进行排序,排好序后再将一维数组中的各个元素依次搬到二维数组中)
package t3; import java.util.Arrays; public class TestArray6 { public static int[][] dyadicArraySort(int a[][]){ int n=0; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { n++; } }//二维数组中数据的个数 int b[]=new int[n]; int k=0; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { b[k]=a[i][j]; k++; } }//二维数组的各元素移到一维数组b Arrays.sort(b);//对一维数组b进行升序排列 k=0; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { a[i][j]=b[k]; k++; } }//一维数组b中元素放回二维数组中 return a; } public static void main(String[] args) { int n[][]={{8,7,10}, {9,1}, {15,0,-3,16}}; output(n); dyadicArraySort(n); output(n); } public static void output(int a[][]){ for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { System.out.print(a[i][j]+" "); } System.out.println(); } System.out.println("-----------------"); } }