数组
数组:
数组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); }
实现数组元素的插入(数组的原始数据需要连续递增)