JAVA基础程序设计——数组排序、算法(数组实例+自己写的算法实例)

来源:互联网 发布:怎么查看端口是否关闭 编辑:程序博客网 时间:2024/05/21 17:07

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

 

1,如何用简单的方法创建数组,算出数组最大值和最小值题目:计算出int[] A={54,36,12,1,21}数组中的最大值,及最小值。题目分析:难点一,什么是数组应该如何创建数组? 数组,其实就是可以存放数据类型为同一类型的容器,可以存放多条数据。  如何创建数组,数组创建有3种方法。这里就不一一解释了。在这里告诉大家一种最简单创建数组的方法:数据类型 变量名 = {数据,数据,数据......} 例如:int[] A={54,36,12,1,21}。 难点二,对问题进行分析,如何实现题目要求。首先需要设置2个变量用来放最大值,和最小值。  还有for 遍历数组中的数据。 还要,有if判断,把正确的结果赋给,变量。程序实现:    package Test;public class getMin_Max {public static void main(String[] args) {//创建2个整型变量min 为最小值 max 为最大值,和一个整形数组。int min,max;int[] A={54,36,12,1,21}; //他们初始化的值都是数组角标最小位置的那个数         min=max=A[0];           System.out.print("数组int []A=");          // for循环,  循环条件是i小于数组长度的时候,循环执行。 赋值 是 i++         for(int i =0; i<A.length;i++){         //if 当 数组遍历到最大角标的时候只打印'数据'。 else 打印' 数据  ,'加上换行          if(i==A.length-1){         System.out.print(A[i]+"\n");          }else{         System.out.print(A[i]+",");         }          //if 当A[i]角标中的数据比min存放的最小值还小的时候          if(A[i]<min){          //把 A[i]角标中的数据,赋给最小值          min=A[i];          }          //if 当A[i]角标中的数据比max存放的最大值还大的时候          if(A[i]>max){          //把 A[i]角标中的数据,赋给最大值          max=A[i];          }                    System.out.println("int []A 中的最大值="+max);          System.out.println("int []A 中的最大值="+min);                 }}}2,对数组进行排序。(顺序排序)题目:编写一个方法,用算法对数组a[]={20,10,50,40,30,70,60,80,90,100}进行从大到小的排序。题目分析:难点一,如何让数组中的数据,正确的位置,进行互换。     难点二,如何获取数组的最大角标:数组的最大长度减1。 a.length-1;     难点三,如何让数组中所有的数都进行一次比较。使用 for循环嵌套,来实现让数组中的每一个数都做一次比较。      难点三,(没有难点)其实,java.util.Arrays 自带了对数组的排序,我们做这个题的目的是,了解数组角标。以及,在计算数组的时候,数组在内存中,是如何让存放的。在这个方法里是使用Arrays.toString(‘数组’)方法,实现对数组的打印,没有遍历数组!    程序实现:import java.util.Arrays;public class ArraysDome {public static void main(String[] args) {int a[]={20,10,50,40,30,70,60,80,90,100};//打印没有经过排序前的数组,在这里没有写如何遍历数组(上一个文档里已经实现)// 用了,APIjava.util.Arrays 包中的toString(数组)代替。 System.out.println(Arrays.toString(a)); //执行getPa(int [] a); 方法。getPa(a);//打印 排序后的数组       System.out.println(Arrays.toString(a));}public static void  getPa(int []a){//int b=0在这里做数组的最小角标使用, 当 b小于a最大角标时程序才会运行,        // 在排序中,最后一个角标位置的数,没有必要自己和自己比较,所有要,小于,//度减一。for(int b=0;b<a.length-1;b++){//f=b的角标加一, 当f角标大于最大角标的时候,循环结束。//因为比较的话,是前面一个数据和后面的数据相比较。所以加一for(int f=b+1;f<=a.length-1;f++){    //当 b角标的数据,小于循环角标f里数据的时候,    if(a[f]>a[b]){// b角标数据和f角标数据互换   int top=a[f];    a[f]=a[b];    a[b]=top;    }}}}}3,对数组进行快速的排序。(冒泡排序)题目:编写一个方法,用更快速的方法对数组a[]={20,10,50,40,30,70,60,80,90,100}进行从小到大的排序。难点一,什么是冒泡排序。其实冒泡排序就是,相邻的两个数进行比较。把大(小)的数,与后一个互换, 放在,最后面(或前面)。逐次递减,减少内部循环的次数。以实现代码优化的目的。程序实现:import java.util.Arrays;public class ArrayDemo2 {public static void main(String[] args) {int[] arr={20,10,50,40,30,70,60,80,90,1};System.out.println(Arrays.toString(arr));bubble(arr);System.out.println(Arrays.toString(arr));}public static void bubble(int[] arr){ //(此处只做简略解释:) arr.length 是防止角标越界   -1 是为了代码优化 for(int x = 0 ; x < arr.length -1; x++){   //arr.length-x,最大角标每圈下来少比一次,因为每比完一次,最大的数据,就会放在最后面   //-1防止数组越界异常      for(int y = 0 ; y < arr.length-x-1; y++){  //数组角标相邻的两个数据进行比较,       //条件:如果前面一个数据  大于  后面一个  数据互换。这样就可以最大数据放在y可循环到的最大角标处       if(arr[y] > arr[y+1]) {       int temp = arr[y];   arr[y] = arr[y+1];   arr[y+1] = temp; }    }    }} }4, 数组数据匹配查找高效率算法(折半算法)题目:给出一个数字,用折半的方式算出,数组中是否有你所填入的数字?(数组任意,数字任意)题目分析:难点一,了解什么是折半算法以及它的特点。折半只能对,有序的数组进行排序。难点二, 如何实现,折半?(程序中有注解)注意:当方法执行到return的时候,返回数据。程序结束。如果没有方法没有返回值方法会直接结束。 程序实现:    package test_A;public class BinaySearch {//折半 条件:  /* 1,保证数组是有序排列!   * 要完成的事情:   * 指定一个数组, 指定一个关键字,查找这个关键字是否是这个数组中,   * 找到指定关键字,将返回关键字所在数组的下标   * 找不到就返回-1;   * 注意:当最小角标小于等于最大角标的时候,才能折半。   * 有 3个指针!   * */public static void main(String[] args) {            int [] a={1,3,5,7,8,10,11};            int c=7;                       System.out.println(getSearch(a,c));} public static int getSearch(int[]a,int c){//int [] a 传入的数组,int c 传入的参数 int min=0;//最小角标int max=a.length-1;//最大角标int mid=0;//折中角标// 当最小角标, 大于最大角标的时候,跳出循环while(min<=max){//折中角标=(最大角标+最小角标)/2;mid=(min+max)/2;//判断, 当 折中角标中的数字,大于你所给的数字时if(a[mid]>c){// 最大角标=折中角标-1; 把较大的数据排除。max=mid-1;//判断 当折中角标的数字,小于你给的数字时,}else if(a[mid]<c){//最小角标位=折中角标+1,把较小的数据排除。min=mid+1; }else{//只有,在a[mid]==c 的时候,//返回角标; 注意:方法中只要执行到return, 方法就会直接结束。return mid; }}return -1;//当条件不满足时,方法返回 -1;}}5,查表法的使用题目:给定一个十进制的数据,通过计算,得出十六进制。题目分析:难点一, 如何实现十进制转十六进制的算法。 我们学过用二进制转换十六进制。直接计算2进制的后四位,然后连接起来! 而十进制的数在计算机中的储存形式也是2进制。所以,我们可以通过,逻辑运算符&, 和 无符号右移。来解决算法问题(实例中将详细说明)。难点二,如何让你所取到的字符,按照你想要的顺序正确的输出。建立临时数组,获取数的最大角标,按照角标从大到小的顺序逐次加入数据。 package table;public class Table {public static void main(String[] args) {tableSearch(0);}public static void tableSearch(int num){//定义一个表,放入,你所需要的数据{if(num==0){System.out.println(0);}}char[] arr={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//定义一个临时的数组用于存储用户临时查找的数据char[] chs=new char[8];int pos=chs.length-1;//获得你存放数据那个数组的,最大角标值。while(num!=0){/*int temp=num&15;   * 假如   temp =14 那么   17二进制中的表现形式 * & 00001110   *   00001111  &的 特点相同为真! *   00001110 *   那么 temp=14;  那么。这个14就是,你所获得arr数组中的角标* */int temp=num&15;// arr表你所需要的角标 放进 temp 里。//把你从arr中获取的数据,放到chs 最大的角标数组里。之后,pos--是为了从后先前放入数据chs[pos--]=arr[temp];//将num无符号右移4个二进制位/*   假如 num=19    >>>4 那么就是  *            0000 0000 0000 0000 0000 0000 0001 0011 *            0000 0000 0000 0000 0000 0000 0000 0001  ||0011    *             num =1;相当于,除以16 * */ num=num>>>4;}//循环遍历for(int i=pos;i<chs.length;i++){System.out.print(chs[i]+" ");}}}6,用2个回文数,实现菱形的杨辉三角(不建议,深入解析)第六实例是我花了4个多小时写出来的。写完之后感觉自己确实是无聊极了,写完之后让朋友看,他们说你写的有用吗? 真的是莫大的打击。没有注解,只有代码!提供给无聊的朋友研究! 提示一下,所有的算法基本上都包含在那2个if 条件里面。 用了4个下标控制了形状的输出,以及数字的计算。 (此方法非完整版,希望大家多给指点完成代码) (附送运行结果以及计算出的数字,以供参考)package Test;public class Test4 {// 打印棱形无空格完整版 +改进 版/** *  作者:张占忠 *  代码:棱形无空格完整版 +改进 版 */public static void main(String[] args) {/* * 初期 规律    :使用回文数判定 *     *   -3      1      3         7      ***   -2      3     2         7     *****   -1      5    1         7    *******    0      7   0         7     *****    1      5    1         7      ***    2      3     2         7       *    3      1      3         7 *菱形,打印后所得出的数字X=-4  F=4     y=-9v=0 y=-8v=1 y=-7v=2 y=-6v=3 y=-5v=4 y=-4v=5*y=-3v=6 y=-2v=7 y=-1v=8 y=0v=9 X=-3  F=3     y=-9v=0 y=-8v=1 y=-7v=2 y=-6v=3 y=-5v=4*y=-4v=5*y=-3v=6*y=-2v=7 y=-1v=8 y=0v=9 X=-2  F=2     y=-9v=0 y=-8v=1 y=-7v=2 y=-6v=3*y=-5v=4*y=-4v=5*y=-3v=6*y=-2v=7*y=-1v=8 y=0v=9 X=-1  F=1     y=-9v=0 y=-8v=1 y=-7v=2*y=-6v=3*y=-5v=4*y=-4v=5*y=-3v=6*y=-2v=7*y=-1v=8*y=0v=9 X=0   F=0     y=-9v=0 y=-8v=1*y=-7v=2*y=-6v=3*y=-5v=4*y=-4v=5*y=-3v=6*y=-2v=7*y=-1v=8*y=0v=9*X=1   F=-1    y=-9v=0 y=-8v=1 y=-7v=2*y=-6v=3*y=-5v=4*y=-4v=5*y=-3v=6*y=-2v=7*y=-1v=8*y=0v=9 X=2   F=-2    y=-9v=0 y=-8v=1 y=-7v=2 y=-6v=3*y=-5v=4*y=-4v=5*y=-3v=6*y=-2v=7*y=-1v=8 y=0v=9 X=3   F=-3    y=-9v=0 y=-8v=1 y=-7v=2 y=-6v=3 y=-5v=4*y=-4v=5*y=-3v=6*y=-2v=7 y=-1v=8 y=0v=9 X=4   F=-4    y=-9v=0 y=-8v=1 y=-7v=2 y=-6v=3 y=-5v=4 y=-4v=5*y=-3v=6 y=-2v=7 y=-1v=8 y=0v=9 *    计算后的运行结果     1        121      12321    1234321  123454321  1234321    12321      121        1           * *///(x>y||Math.abs(x)>Math.abs(y))getPrismatic(4);}public static void getPrismatic(int c){       c*=-1;  for(int x=c,f=Math.abs(c);x<=Math.abs(c);x++,f--){  //System.out.print("X="+x+" F="+f);  for(int y=((c*2)-1),v=0;y<=0;y++,v++){//System.out.print(" y="+y+" v="+v); if(!(y>f)&&!(y>x)&&v>Math.abs(x)){ if(Math.abs(y)+Math.abs(x)>Math.abs(v)+Math.abs(f)){ System.out.print(v-Math.abs(x)); }else{ System.out.print(Math.abs(y)-Math.abs(f)+1); }  }else{ System.out.print(" "); }} System.out.println(); }  }}个人总结:      学完数组,让我对数组角标控制提高了一个新的档次。对运算符的使用也有了提高。感觉收获还是蛮多的! 在这里就不做过多的技术总结了! 想必大家都比我了解的更透彻。祝大家工作顺利,学习顺利。


 

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------