数组

数组:

数组Array即一组数据模式用来记录多个类型相同的数据

特点:

  1.数组长度不可变

  2.数组可存储基本类型,也可以存储引用类型

  3.数组在内存中是连续存储数据的

  4.数组通过索引(下标)对连续数据进行访问的

如何实现数组元素的删除:

  1.判断待删除的元素是否在数组中

  2.将删除元素的最后一位依次向前移动

  3.最后位元素不进行打印

如何实现数组元素的添加(数组值必须连续递增):

  1.查找要添加元素在数组中的位置

  2.该位置为第一次比新增值大的元素索引

  3.从数组最后位开始向前依次交换元素

  4.将新增值写入查找位置

如何查找最大值:

  1.设定一个元素为最大值

  2.依次将每个元素与最大值进行比较

  3.比最大值更大的元素将成为新的最大值

常用的排序算法:

  1.冒泡排序法(最大值在最后)

    1)将相邻元素依次比较,如果后一个较小则交换位置

    2)通过一轮比较(数组中每个元素都比较依次),数组中的最大值将产生在最后

    3)已经产生的最大值不再参与比较,开启下一轮比较

    4)每轮都产生一个最大值

    5)直至只有一个元素时结束排序

  2.选择排序法

    1)将第一个数作为最小值依次和后面的每个元素进行比较

    2)如果后面的元素比第一个元素小,则交换两数

    3)一轮比较后,第一个元素即为最小值

    4)第二轮比较从第二个元素开始,依次和后面的每个元素分别比较,比较过后产生第二个最小值在第二位

  3.快速排序法(二分排序法):

    1)将第一个数定位基准数:1)j负责从右往左查找比基准数(第一个数)小的数

                 2)i负责从左往右查找比基准数(第一个数)大的数

    2)若i和j没有碰头,且都找到了,则将两数array[ i ]和array[ j ] 交换,这样左边的就是小的,右边的就是大的

    3)知道 i 和 j 相遇,则此处即为基准数应该在的地方,将array[ left ]与array[ i ]交换

    4)第一轮结束后,则在基准数位置即i与j相遇处将数组一分为二

    5)重新调用递归该方法,左右边界重新赋值

创建数组(三种方式):

/************方式一*********/
String[] array=new String[5];
System.out.println(array[0]);
int[] Array=new int[5];
System.out.println(Array[1]);


/************方式二*********/
String[] array1=new String[]{"tom","jack","jerry"};
//访问第二个数值
System.out.println(array1[1]);
//访问第一个数值
System.out.println(array1[0]);
//访问倒数第二个数值
System.out.println(array1[array1.length-1]);

/************方式三*********/ String[] array2={"tom","jack","jerry"}; for(int i=0;i<array2.length;i++){ System.out.println(array2[i]); }

检索数据是否在数组中(没有找到返回-1,找到返回下标):

 public int find(String[] array,String value){
        //默认返回-1
        int index=-1;
        //遍历数组
        for(int i=0;i<array.length;i++){
            //如果有相同的数值
            if(array[i].equals(value)){
                //返回下标
                index=i;
                break;
            }
        }
        return index;
    }

删除数组中元素的方法:

  方法一:将元素赋值为null:打印时判断是否为null,不为null则打印出来

public void delete(String[] array,String value){
        //查找是否存在的方法,如果存在返回下标,如果不存在返回-1
        int index=find(array,value);
        //判断值是否在数组中存在
        if(index!=-1){
            //如果存在则赋值为null
            array[index]=null;
        }
    }    

  方法二:向前赋值法:打印时不打印最后一位

 public void delete2(String[] array,String value){
        //数组中是否存在该值的方法,不存在返回-1,存在返回下标
        int index=find(array,value);
        if(index!=-1){
            //循环遍历
            for(int i=index;i<array.length;i++){
                //从查找为null的位置开始,从后向前覆盖
                array[i]=array[i+1];
            }
        }
 }

数组中的最大值

  public int findMax(int[] array){
      //先确定一个最大值,确定为第一个最方便
      int max=array[0];
      //从第二个开始比较
      for(int i=1;i<array.length;i++){
          //如果数值大于指定的最大值,将值赋值给最大值
          if(array[i]>max){
              max=array[i];
          }
      }
      return max;
  }

 冒泡排序法:

public void sort(int[] array){
  //外层循环控制比较的轮数
  //最后一次只剩一个时不用再比较
  for(int i=0;i<array.length-1;i++){
    //内层循环控制每轮要比较的次数
    //循环了多少论,下一轮就少比较多少次(每一轮都多出一个不再参与比较的数)
    for(int i=0;j<array.length-1-i;j++){
      //如果后一位更大,将大的数换到最后
      if(array[j+1]<array[j]){
        //交换两数
        int temp=array[j+1];
        array[j+1]=array[j];
        array[j]=temp;
      }
    }
  }
}

选择排序法:

  整个排序方法和冒泡排序方式基本一致,只是冒泡比较的基数在改变

public void sort(int[] array){
  //外层循环控制轮数
  for(int i=0;i<array.length;i++){
    //内层循环控制每一次比较的轮数,将i索引的元素依次和后面的每个元素进行比较
    for(int j=i+1;j<array.length;j++){
      //升序:如果前一位更小,则将大的往后交换
      if(array[i]>array[j]){
        int temp=array[j];
        array[j]=array[i];
        array[i]=temp;
      }
    }
  }
}

快速排序法(二分排序法):

public void sort(int[] array,int left,int right){
  //判断是否需要继续递归
  if(left==right){
    teturn;
  }
  //定义基准值
  int middle=array[left];
  //i是左边界
  int i=left;
  //j是右边界
  int j=right;
  //当i!=j时,则继续循环
  while(i!=j){
    //进入循环后,j从右往左,不能走过i,若j对应的位置大于基准值,则继续向左前进
    while(array[j]>=middle&&i>i){
      j--;
    }
    //进入循环后,i从左往右,不能走过j,若i对应的位置小于基准值,则继续向右前进
    while(array[i]<=middle&&i<j){
      i++;
    }
    //当i与j停下来且i!=j时,i与j没相遇则将两个数交换,则左边小,右边大
    int temp=array[i];
    array[i]=array[j];
    array[j]=temp;
  }
  //当i与j停下来且i=j时,则将该位置与基准值相交换
  array[left]=array[i];
  array[i]=middle;
  //将原数组分两段继续递归
  sort(array,left,i-1);
  sort(array,i+1,right);
}

实现数组元素的插入(数组的原始数据需要连续递增)

 

posted @ 2020-08-16 11:01  小小野生程序员sunny  阅读(115)  评论(0编辑  收藏  举报