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学习型技术博客、期待与您交流! ------------
- JAVA基础程序设计——数组排序、算法(数组实例+自己写的算法实例)
- Java语言基础 数组的排序算法
- Java实例—数组的排序和搜索
- 黑马程序员-----JAVA基础--数组排序的两种算法
- Java数组排序算法
- 【Java】数组实例--自动排序
- 数组的排序算法
- 数组的排序算法
- 数组的排序算法
- 实用算法的分析与程序设计——贪心算法(包含实例,代码)
- 数组——排序算法
- Java实现数组的快速排序(快速排序算法)
- Java数组中常见的排序算法
- Java中常用的数组排序算法
- java有关数组排序算法
- 数组排序 —— 常用基础数组排序算法(冒泡、选择、插入、归并、快速、堆、希尔、计数、基数排序)
- 曾经写的二维数组整体排序的算法
- 写一个二维数组排序算法
- hdu 2565
- 心情不好?问问自己这5个问题吧……
- 人生致命的八个经典问题
- makefile 总结
- cocos2d-x游戏实例 《简单棋》入门尝试(一) 整体思路
- JAVA基础程序设计——数组排序、算法(数组实例+自己写的算法实例)
- UVa 10115 - Automatic Editing
- 邓仲祥:红红火火过大年
- UVa10815 - Andy's First Dictionary
- UVa 10878 - Decode the tape
- sh cssupdate
- Gentoo Linux的boot分区问题及其它
- zoj 1151 Word Reversal
- ssh配置c3p0