我眼中的数组和冒泡排序

  

一维数组

  

数组是一个定长的容器,可以放相同类型的数据。
数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型

  

专业解释

  

数组(数组)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
线性表,顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。
数组具有连续的内存空间和相同的数据类型

  

数组的声明

  

数据类型[]arrayName;
注:数组在声明时不能指定数组长度,即数据类型[n] arrayName;是不合法的

  

数组的创建

  

arrayName=新数据类型[n];

  

动态创建(初始化)

  

数据类型[]arrayName=新数据类型[n];

  

静态创建(初始化)

  

数据类型新数据类型[][]arrayName={value1, value2,……家};

  

数组的内存模型

  

数组的声明即数组变量名存储在栈中,数组的创建在堆中,即在堆中开辟连续的对应数组长度的空间(所有引用类型的创建都在堆中)
我眼中的数组和冒泡排序”> <br/>所有引用类型的变量名存的都是地址。</p>
  <h3>数组创建后的初始默认值</h3>
  <p>引用类型的数组元素默认初始值是null <br/>字符类型的数组元素默认初始值是空格(0对应的字符)<br/>整数类型的数组元素默认初始值是0 <br/>浮点数类型的元素默认初始值是0.0 <br/>布尔类型的元素默认初始值是假</p>
  <h3>为什么数组索引值从0开始呢? </h3>
  <p>从数组存储的内存模型上来看,“下”标最确切的定义应该是“偏移(抵消)”。如果用一个来表示数组的首地址,一个[0]就是偏移为0的位置,<br/>也就是首地址,一个[k]就表示偏移k个type_size的位置,所以计算一个[k]的内存地址只需要用这个公式:</p>
  <p> [k] _address=base_address + k * type_size </p>
  <p>但是,如果数组从1开始计数,那我们计算数组元素一个[k]的内存地址就会变为:</p>
  <p> [k] _address=base_address + (k - 1) * type_size <br/>对比两个公式,我们不难发现,从1开始编号,每次随机访问数组元素都多了一次减法运算,对于CPU来说,就是多了一次减法指令。数组作为非常基础的数据结构,通过下标随机访问数组元素又是其非常基础的编程操作,效率的优化就要尽可能做到极致。所以为了减少一次减法操作,数组选择了从0开始编号,而不是从1开始。<br/>也有可能是历史原因<br/> C语言设计者用0开始计数数组下标,之后的Java、JavaScript等高级语言都效仿了C语言,或者说,为了在一定程度上减少C语言程序员学习Java的学习成本,因此继续沿用了从0开始计数的习惯。实际上,很多语言中数组也并不是从0开始计数的,比如Matlab。甚至还有一些语言支持负数下标,比如Python。</p>
  <h3>数组与链表的区别</h3>
  <p>链表适合插入和删除,时间复杂度是O(1),数组支持随机访问,根据下标随机访问的时间复杂度为O (1)。</p>
  <h3>增强的循环遍历数组</h3>
  <p>按照数组下标顺序,依次将冒号右边数组中的每个元素赋值给冒号左边的变量,数组长度为的循环的次数<br/>(数组元素类型变量名:数组名){<br/>语句;<br/>} </p>
  <p>编写一个长度为5的整型数组,每个元素赋值为清廉的随机整数,遍历该数组,输出每个元素。<br/>的arr int []=new int [5]; <br/>随机r=新的随机();<br/> (int i=0;我& lt;arr.length;我+ +){<br/> arr[我]=r.nextInt (10); <br/>} <br/> (int t: arr) {<br/> System.out.println (t); <br/>} </p>
  <h2>多维数组</h2>
  <p>数据类型是数组的数组<br/> <img src=

  

动态初始化

  

数组名=new数据元素类型(行数)(列数),
行数不能为空

  

静态初始化

  

数组类型数组名[][]=new数据类型[][]{{元素11元素12日…},{元素21日…}}

  

一维数组冒泡排序

  
 <代码> arr int []=new int[]{89年4,45岁,1,13日,7};
  int温度;
  for (int i=0;我& lt;arr.length;我+ +){
  for (int j=0;j & lt;加勒比海盗。长度- 1;j + +) {
  如果(arr [j]比;加勒比海盗[j + 1]) {
  temp=arr [j];
  arr [j]=arr [j + 1);
  加勒比海盗[j + 1)=temp;
  }
  }
  } 
  

优化

  
 <代码> arr int []=new int[]{89年4,45岁,1,13日,7};
  int温度;
  布尔标志=false;
  for (int i=0;我& lt;arr.length;我+ +){
  for (int j=0;j & lt;加勒比海盗。长度,我1;j + +) {
  如果(arr [j]比;加勒比海盗[j + 1]) {
  temp=arr [j];
  arr [j]=arr [j + 1);
  加勒比海盗[j + 1)=temp;
  国旗=true;
  }
  }//当没有数据交换时,证明数组已排序完成,退出子循环
  如果(国旗){
  打破;
  }
  }

我眼中的数组和冒泡排序