数组与排序算法

一、数组的定义

      1.基本用法

       Type arrayName[ ]

       与C中不同的是,java在数组定义时并不为元素分配内存,而对于如上定义的数组我们是不能访问它的任何元素的。所以,我们需要用到运算符new为它分配内存空间。格式为:类型[ ] 数组变量名=new 类型[长度];

如:int[ ] ia=new int[10];

       值得注意的是,数组一旦定义,它的长度就会是固定的。另外,可通过“数组名.length”取得数组的长度;“数组名[下标值]”取得相应下标对应的取值。但数组的下标值是从0开始到数组长度-1,若超出此范围则越界报错。

       2.定义的三种方式

//仅定义一个某类型的数组变量,并没有指明数组对象,这时ia的值为null
int[] ia;
//将数组变量指向一个数组对象,数组中每个位置的默认值为0
ia=new int[5];//默认初始化法
//创建数组时就给数组中的元素赋值
String[] s=new String[]{"Chinese","Math","English"};//静态初始化法
//上句代码相当于以下几行代码
String[] s1=new String[3];
s1[0]="Chinese";
s1[1]="Math";
s1[2]="English";//动态初始化法

 二、两种常见易出现错误

       1.数组越界

       2.空指针异常

       虽说这两种错误相关的知识都已了解,但还是值得引起注意!

三、多维数组

        多维数组和一维数组的创建赋值都类似,可以这样理解:二维数组相当于就是一个数组里的每个元素又是一个数组,这样一来,多维数组就好理解多了。

练习:

了解了一下希尔排序,但是觉得希尔排序还不如冒泡,插入,选择排序简单,不过它也算是一种排序方法吧,下面来看看希尔排序:

//希尔排序
public static int[] shell(int[] x){
        //分组,每次对半分
	for(int increment =x.length/2;increment>0;increment/=2){
		//并从半分处与后边每个数相比
		for(int i=increment;i<x.length;i++){
	         	int temp=x[i];
	            	int j=0;
	            	for(j=i;j>=increment;j-=increment){//该循环对每个j只运行一次
		     		if(temp<x[j-increment]){
					x[j]=x[j-increment];
		                	System.out.println(i+"   "+j+"    "+(j-increment));
				}else{
					break;
				}
			}
			x[j]=temp;
			System.out.println(j);
	    	}
         }
         return x;
}

 导致我理解出错的地方在于第二个循环,没注意到此循环是从对半分处一直循环到数组最后一个元素。

另外,在练习中掌握了找出二维数组的最大值的方法:

//找出二维数组中的最大值
public static void Max(int[][] ib){
	int Max=ib[0][0];//假设数组的第一个元素值为最大值
	int value[]=new int[ib.length*ib[0].length];//考虑到可能存在多个最大值,用一个一维数组记录下来
	//循环比较
	for(int i=0;i<ib.length;i++){
		for(int j=0;j<ib[i].length;j++){
			if(ib[i][j]>Max){
				Max=ib[i][j];
				//由于新的最大值的出现,以前存有的所有最大值清空
				for(int m=0;m<=i;m++){
					for(int n=0;n<=j-1;n++){
						value[m*ib[0].length+n]=0;
					}
				}
				value[i*ib[0].length+j]=ib[i][j];//将目前最大值保存起来
			}else if(ib[i][j]==Max){
				value[i*ib[0].length+j]=ib[i][j];//把与暂存最大值相等的数存起来
			}
		}
	}
	for(int i=0;i<ib.length*ib[0].length;i++){
		if(value[i]==Max){
			ib[i/ib[0].length][i%ib[0].length]=value[i];//将一维数组保存的最大值还原成二维数组
			System.out.println("二维数组最大值所在位置为"+i/ib[0].length+i%ib[0].length+"最大值为"+Max);
		}
	}
}

 其间主要是要考虑到可能有多个最大值的同时存在,采用一维数组将可能的最大值暂存起来,当然还有另外更多更好的方法^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值