龟速三兄弟
冒泡排序:
简单来说,就是将数据从用过一遍一遍的前后比较从小到大排列.话不多说,直接举例
静态初始化一维数组{10,20,11,35,6,89},进行冒泡排序
int[] arr= {10,20,11,35,6,89};
for( int i = 0 ; i<arr.length-1 ;i++ ) {//比较次数
for( int j=0, b=0;j<arr.length-1 ;j++ ) {//遍历
if(arr[j]>arr[j+1]) {//若j>j+1,则交换位置
b=arr[j];
arr[j]=arr[j+1];
arr[j+1]=b;
}
}
}
for( int i=0 ; i<arr.length ; i++ ) {
System.out.print(arr[i]+" ");
}
插入排序
其原理为先假定数组索引0处元素是"有序"的,用后面的元素依次与其比较,若比它小则交换位置,而后索引1与索引2处元素比较,若索2处小于索1处,则交换元素位置,注意,此时索引1处元素还要与索引0处元素比较,若小于,则交换位置. 以此类推 排序代码如下:
int[] arr = {9,6,45,2,24,36,11}; //定义一个乱序数组
for( int i = 1 ;i<arr.length ; i++ ) { //假定第一个元素有序
if(arr[i]<arr[i-1]) { //如果当前元素小于前一个元素
int temp=arr[i]; //则定义一个临时变量,将当前元素存储起来
int j=i; //记录当前元素的索引
while(j>0&&temp<arr[j-1]) { //该循环的作用是判断当前值是否小于前一个元素
arr[j]=arr[j-1]; //若小于则交换位置,随着j--,继续与前面元素比较、交换
j--;//注意最后一次j-- 后 j的值
}
//
arr[j]=temp; //插入
}
}
for( int i=0 ; i<arr.length; i++) {
System.out.print(arr[i]+" ");
}
选择排序
原理:每一次都选择数组未排列部分中最小的元素放在未排列部分的首位
int[] arr= {5 , 9 , 7 , 33 , 55, 12};
for( int i=0 ; i<arr.length ; i++) {
int minIndex=i; //先选定未排列部分首个元素的索引当做最小元素的索引
for( int j =i+1 ; j<arr.length ; j++ ) {
if(arr[minIndex]>arr[j]) { //当前元素与后面元素作比较,若后面的小,则更改最小元素索引
minIndex=j;
}
}
int temp = arr[i]; //最小元素与未排列部分首位交换位置
arr[i]=arr[minIndex]; //交换后,最小元素最小元素前为排列有序部分,将不参与之后的循环
arr[minIndex]=temp; //而后随着i+1,新的首位元素出现,进入下一次循环
}
for( int i=0 ;i<arr.length ; i++ ) {
System.out.print(arr[i]+" ");
}
二维数组
初始化方法:
//动态初始化: 数据类型[][] 变量名 = new 数据类型[行][列];
//静态初始化: 数据类型[][] 变量名 = { {元素,元素}, {元素}, {元素,元素,元素}, .......}
动态
int[][] arr = new int[2][3];
就会在内存中开辟一个如下图所示的包含两个一位数组且每个一位数组能存储三个int类型元素的二维数组,他们是包含关系,此时个个位置为int类型默认值0
那么想像一位数组那样赋值和取值,该如何确定位置呢? 如下图所示:
静态
很简单,这里只类比动态做简单叙述
int[][] arr={ {1,2,3} , {2} ,{1,5,6} }
其效果: