黑马程序员 Java基础_3 数组,数组排序和应用

一、什么是数组


1、数组是有序的元素集合。而元素可以是基本类型,也可以是对象的引用或者其他数组的引用。数组本身就是一个继承Object的对象,所以在分配空间是要用new来建立。

2、数组的建立。

一般有两种方法:

第一种:数据类型  数组名 [ ]    例如  int arrayName [ ]=new int[ 长度],长度是根据需求个数添加进去。

第二种:数据类型[ ] 数组名     例如  int[ ] arrayName=new int [长度 ] 

3、数组在内存的表示

当一个数组建立是,系统会在栈内存分配一个arrayName的空间,里面装的是数组在堆内存的引用,所以arrayName里面不是数组,只是数组的引用。

4、如何获得数组元素的值

      数组元素的值可以通过arrayName[ index]的方式来访问,例如int[ ] a=new int[3],int b=a[2];像int[ ]数组元素的默认值都是0,也就是说b等于0,还有对数组的访问要注意角标,数组的角标是从0开始的,所以数组最后一个元素为[length-1],如果index大于length-1,就会报异常。

二、多维数组


多维数组可以看作是数组的数组。就是数组元素是数组。

例如 int[ ][ ] a=new int[ 2][3 ],数组a是一个二维数组,如果要访问里面的元素就要提供两个角标,例如a[1][1],他就是访问a里面第二个数组的的第二个元素。


三、数组的排序


1、冒泡排序

冒泡排序就是通过从角标小到大每次对比相邻的两个值,值大的换到后面,每一轮都会把最大的值换到后面,所以第一次只要比较元素个数减1,以后每一轮比较次数都减一次。

for (int j=0;j<arr.length;j++)  
        {  
            for (int i=1;i<arr.length-j;i++) 
            {  
                if (arr[i+1]>arr[i])//若改成<是从大到小排序  
                {  
                    int temp = 0;  
                    temp = arr[i];  
                    arr[i] = arr[i+1];  
                    arr[i+1] = temp;  
                }  
            }  
        }  

2、选择排序

选择排序就是从第一个位置开始,通过第一个位置的元素与后面的元素进行比较,然后,把最小的换到第一位,然后从第二个位置开始重复操作。

for (int j=0;j<arry.length;j++)  
        {  
            //i=j,每比较一轮就减少一个数,比较后,再用第二个数获得后面的最小值  
            for (int i=j+1;i<arry.length;i++)  
            {  
                //换值  
                if (arry[j]>arry[i])  
                {  
                    int temp = 0;  
                    temp = arry[j];  
                    arry[j] = arry[i];  
                    arry[i] = temp;  
                }  
            }  
        }  

最后是毕老师的一个对数组应用的练习题,代码如下。

步骤 
    1创建类FindArry 
    2用for遍历数组,如果查找到相同内容,记录脚标并返回 
    3如果未找到,就返回-1 
 
    如果要在一个有序数组中插入一个数,之后仍有序 
    就是先查找数组,用折中法:如果查找到有此数,则返回的中间值就是插入的地方,否则将返回的-1改成返回min,即为插入的地方 
    如:{1, 2, 3, 5, 6, 8, 11, 13}插入8,返回mid = 5;插入后为{1, 2, 3, 5, 6, 8, 8, 11, 13} 
    插入10,返回min = 6,插入后为{1, 2, 3, 5, 6, 8, 10, 11, 13} 
*/  
  
import java.util.*;  
class FindArry  
{  
    //方法一:遍历每一个元素查找  
    public static int findarr(int[] arr,int key)  
    {  
        for(int i=0;i<arr.length;i++)  
        {  
            if(arr[i] == key)  
            {  
                return i;  
            }  
        }  
        return -1;  
    }  
  
    //方法二:折半,前提是数组是按大小顺序排列好的,  
    //用查找的值和中间值比较,大则和下一半中间值比依次,小则和上一半中间值比,找到则返回。  
    //        小值的编号在左移或大值的编号在右移。要判断是否大小值的编号相遇,仍若未找到,则不再循环,返回-1  
    public static int FindArry1(int[] arr,int key)  
    {  
        int min,max,mid;  
        min = 0;  
        max = arr.length-1;  
        mid = (min + max)/2;  
          
        //循环,查找中间值与要查找的值比较  
        while(key != arr[mid])  
        {  
            if (key > arr[mid])  
                min = mid +1;  
            else   
                max = mid - 1;  
            if (min > max)  
                return -1;  
            mid = (min + max)/2;  
        }  
        return mid;  
    }  
  
    //方法三:折半第二种  
    //while的条件改变  
    public static int FindArry2(int[] arr,int key)  
    {  
        int min,max,mid;  
        min = 0;  
        max = arr.length-1;  
          
          
        //循环,查找中间值与要查找的值比较  
        while(min <= max)  
        {  
            mid = (min + max)>>1;  
            if (key > arr[mid])  
                min = mid +1;  
            else if(key<arr[mid])  
                max = mid - 1;  
            else  
                return mid;  
        }  
        return -1;  
    }  
  
    public static void main(String [] args)  
    {  
        int[] arr = {1,6,11,2,8,5,3,13};  
        int m = findarr(arr,3);  
        System.out.println("m=" + m);  
        Arrays.sort(arr);  
        System.out.println(Arrays.toString(arr));  
        int x = FindArry1(arr,13);  
        int y = FindArry2(arr,25);  
        System.out.println("查找13的结果x=" + x + "\n查找25的结果y=" + y);  
    }  
}</span>  





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值