一維陣列的排序及二維陣列
阿新 • • 發佈:2018-11-03
一維陣列的排序及二維陣列
一 . 陣列的三個簡單排序:
1.氣泡排序:
public 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);
public 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.直接插入排序
public 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);
public 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.選擇排序
public 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迴圈:
for (int i=0;i<array.length;i++) {
for (int j=0;j<array[i].length;j++){
brray[i][j]=array[i][j];
}
}
如果是引用資料型別
TestArray[][] 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];
}
}
同樣的:
TestArray[][] 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();
}
TestArray[][] 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);
}
TestArray[][] 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迴圈裡嵌套了一個一維陣列的拷貝;