一维数组的排序及二维数组
一 . 数组的三个简单排序:
1.冒泡排序:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12public static void bubbleSort(int[] array) { for(int i=0;i<array.length-1;i++) { for(int j=0;j<array.length-1-i;j++) { if(array[j]>array[j+1]){ int tmp=array[j]; array[j]=array[j+1]; array[j+1]=tmp; } } } }
最坏的情况就是两个for循环都执行完毕,时间复杂度为O(n^2);
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public static void bubbleSort(int[] array) { int tmp = 0; boolean swap = false; for(int i = 0;i < array.length-1;i++) { for(int j = 0;j < array.length-1-i;j++) { if(array[j] > array[j+1]) { tmp = array[j]; array[j] = array[j+1]; array[j+1] = tmp; swap = true; } } if(!swap) { break; } } }
这是优化的排序算法,可以看出,如果有序数组的话,它只执行一次for循环就结束了;
即最好的情况是这个数组本来就是有序数组(从小到大),时间复杂度:O(n);
稳定性:稳定
2.直接插入排序
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public static void insertSort(int[] array) { for(int i=1;i<array.length;i++) { int tmp=array[i]; int j=0; for(j=i-1;j>=0;j--){ if(tmp<array[j]){ array[j+1]=array[j]; }else{ break; } } array[j+1]=tmp; if(!swap) { break; } } }
最坏的情况就是两个for循环都执行完毕,时间复杂度为O(n^2);
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public static void insertSort(int[] array) { boolean swap = false; for(int i=1;i<array.length;i++) { int tmp=array[i]; int j=0; for(j=i-1;j>=0;j--){ if(tmp<array[j]){ array[j+1]=array[j]; swap = true; }else{ break; } } array[j+1]=tmp; } }
这是优化的排序算法,可以看出,如果有序数组的话,它只执行一次for循环就结束了;
即最好的情况是这个数组本来就是有序数组(从小到大),时间复杂度:O(n);
稳定性:稳定
3.选择排序
复制代码
1
2
3
4
5
6
7
8
9
10
11
12public static void chooseSort(int[] array) { for (int i=0;i<array.length;i++) { for(int j=i+1;j<array.length;j++) { if(array[j]<array[i]){ int tmp=array[i]; array[i]=array[j]; array[j]=tmp; } } } }
时间复杂度O(n);
稳定性:不稳定;
二. 二维数组
1.在C语音中,数组的理解是这样的:
2.在Java中 数组的理解是:
它并不是一个i行j列的一个表;这点要额外注意;
在一维数组中,详细写了四个数组拷贝,二维数组也不例外,for()循环,Object.clone(),Arrays.copyOf(),System.Arraycopy()的基本数据类型都为深拷贝,引用数据类型都为浅拷贝;
for循环:
复制代码
1
2
3
4
5
6for (int i=0;i<array.length;i++) { for (int j=0;j<array[i].length;j++){ brray[i][j]=array[i][j]; } }
如果是引用数据类型
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13TestArray[][] t1=new TestArray[2][2]; t1[0][0]=new TestArray(); t1[0][1]=new TestArray(); t1[1][0]=new TestArray(); t1[1][1]=new TestArray(); TestArray[][]t2=new TestArray[2][2]; for(int i=0;i<t1.length;i++) { for (int j=0;j<t1[i].length;j++){ t2[i][j]=t1[i][j]; } }
同样的:
复制代码
1
2
3
4
5
6
7
8
9
10
11TestArray[][] t1=new TestArray[2][2]; t1[0][0]=new TestArray(); t1[0][1]=new TestArray(); t1[1][0]=new TestArray(); t1[1][1]=new TestArray(); TestArray[][]t2=new TestArray[2][2]; for(int i=0;i<t1.length;i++){ t2[i]=t1[i].clone(); }
复制代码
1
2
3
4
5
6
7
8
9
10
11TestArray[][] t1=new TestArray[2][2]; t1[0][0]=new TestArray(); t1[0][1]=new TestArray(); t1[1][0]=new TestArray(); t1[1][1]=new TestArray(); TestArray[][]t2=new TestArray[2][2]; for(int i=0;i<t1.length;i++){ t2[i]=Arrays.copyOf(t1[i],t1[i].length); }
复制代码
1
2
3
4
5
6
7
8
9
10
11TestArray[][] t1=new TestArray[2][2]; t1[0][0]=new TestArray(); t1[0][1]=new TestArray(); t1[1][0]=new TestArray(); t1[1][1]=new TestArray(); TestArray[][]t2=new TestArray[2][2]; for(int i=0;i<t1.length;i++){ System.arraycopy(t1[i],0,t2[i],0,t1.length); }
可以看出,二维数组的拷贝,其实可以看成一个for循环里嵌套了一个一维数组的拷贝;
最后
以上就是认真天空最近收集整理的关于一维数组的排序及二维数组的全部内容,更多相关一维数组内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复