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

来源:互联网 发布:中国校花大赛数据库 编辑:程序博客网 时间:2024/05/18 01:22

一、什么是数组


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>  





0 0