文章目录
- 1.选择排序
- 2.插入排序
- 3.二维数组
1.选择排序
选择排序:
从数组第一个元素开始,依次和全部元素进行比较大小,交换位置,直到全部排序完成.
public class ArraySort01 {
//选择排序方法一:
public static void main(String[] args) {
int[] a={10,9,8,7,6};
//推算过程
//9,10,8,7,6
//8,10,9,7,6
//7,10,9,8,6
//6,10,9,8,7
//6,9,10,8,7
//6,8,10,9,7
//6,7,10,9,8
//6,7,9,10,8
//6,7,8,10,9
//6,7,8,9,10
//外层循环;取出数组中的元素
for (int i = 0; i < a.length-1; i++) {
//内层循环;遍历数组进行比较
for (int j = i+1; j < a.length ; j++) {
if(a[i]>a[j]){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
System.out.println(Arrays.toString(a));
}
}
输出:
[6, 7, 8, 9, 10]
每个数遇到比它小的数字就交换位置;这导致种方式的运行时间过长;即时间复杂度方面有待优化;
优化:
public class ArraySort02 {
//选择排序优化
public static void main(String[] args) {
int[] a={10,9,8,1,7,6};
//推算过程
//1,9,8,10,7,6
//1,6,8,10,7,9
//1,6,7,10,8,9
//1,6,7,8,10,9
//1,6,7,8,9,10
for (int i = 0; i < a.length-1; i++) {
//定义最小值的索引
int min=i;
//遍历数组,比较大小得出最小值的所在下标;只是标记位置;
for (int j = i+1; j < a.length; j++) {
if(a[min]>a[j]){
min=j;
}
}
//进行交换
int temp=a[min];
a[min]=a[i];
a[i]=temp;
}
System.out.println(Arrays.toString(a));
}
}
输出:
[1, 6, 7, 8, 9, 10]
2.插入排序
假设第一个数组元素已经排序;由第二个数组元素开始,由该元素的位置向前,与前面的元素进行比较;
如果它比前面的数组元素都大,那么它就不移动;
它比前面的元素小,则它替换掉前面的元素位置,被它替换的元素向后移动一个位置;
以此类推,直到所有元素排序完成.
public class Array001 {
//插入排序简化版
public static void main(String[] args) {
int[] a = {4, 3, 1, 8, 6};
//外层循环;取出第二个数到最后一个数
for (int i = 1; i < a.length; i++) {
for (int j= i; j>0; j--) {
if(a[j-1]>a[j]){
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
//输出排序完成的数组
System.out.println(Arrays.toString(a));
//[1, 3, 4, 6, 8]
}
}
输出:
[1, 3, 4, 6, 8]
该方法虽然可以完成排序;在运行时却多了几步不必要的位置交换;
优化:
public class Array002 {
//插入排序
public static void main(String[] args) {
int [] a={4,3,5,2,6};
//3 4 5 2 6
//2 3 4 5 6
//current记录当前准备进行排序的元素
int current =0;
//
for (int i = 0; i < a.length-1; i++) {
//perIndex记录当前比较的元素的位置
int perIndex=i;
current= a[i+1];
while(perIndex>=0 && a[perIndex]>current){
a[perIndex+1]=a[perIndex];
perIndex--;
}
//替换位置
a[perIndex+1]=current;
}
System.out.println(Arrays.toString(a));
}
}
输出:
[2, 3, 4, 5, 6]
3.二维数组
二维数组中的每个元素是一个一维数组;二维数组就是以数组作为数组元素的数组.
声明:
和一维数组类似:
int[][] a;//常用方式
int a[][];
创建:
静态初始化:在创建时,就直接给数组中的元素直接赋值;
例如:
int[ ][ ] a = {{2,2,1},{5,1,4},{6,7,9}};
int[ ][ ] a = new int[ ][ ]{{11,20,23},{15,12,14},{18,19,3}};
动态初始化:在创建时,给了数组长度,没有给数组中的元素赋值;
例如: int [ ][ ] a = new int[4][3];
该二维数组中包含了4个一维数组;每个一维数组的长度为3;
当没有给定一维数组长度时,也是可以的,之后可以根据需要进行赋值:
例如:
int[][] a=new int[4][];
a[0]=new int[]{3};
a[1]=new int[]{1,2,3,6};
a[2]=new int[4];
System.out.println(Arrays.deepToString(a));
//输出二维数组a
//[[3], [1, 2, 3, 6], [0, 0, 0, 0], null]
其中,给二维数组a的第一个一维数组(即a[ 0])静态创建赋值,它的长度为1;输出为[3];
二维数组a的第二个一维数组(即a[ 1])静态创建赋值,它的长度为4;输出[1, 2, 3, 6]
;
二维数组a的第三个一维数组(即a[ 2])动态创建,它的长度为4;但是没有赋值;int型默认为0;所以输出的是[0, 0, 0, 0];
并没有给二维数组a中的第四个一维数组(即a[ 3])长度,所以它输出null;
二维数组的遍历:
public class Demo01 {
public static void main(String[] args) {
//二维数组创建
int [][] a={{1,2,3},{4,6},{4,3,55}};
//二维数组的遍历
for (int i = 0; i <a.length ; i++) {
for (int j = 0; j < a[i].length; j++) {
System.out.print(a[i][j]+"\t");
}
}
//遍历
// 1 2 3 4 6 4 3 55
}
}
Debug调试
在开发工具中使用debug调试
断点 :在需要调试代码行设置一个断点;然后开始debug调试模式;
使用debug模式运行
F7键 step into 可以进入到调用的方法中;
F8键 step over 进行逐步调试 ,不会进入到调用的方法中;
shift + F8键 Step Out 跳出调试