【JAVA】基礎:陣列、二維陣列、排序
阿新 • • 發佈:2019-01-02
陣列:
用於儲存大量同一型別的資料。
陣列的定義格式:
資料型別 陣列名[ ]=new 資料型別[陣列長度 ];
給值:
1.陣列名 [下標 ]=值; 如:陣列名[ 0]=10; 陣列名[ 1]=20;
2.資料型別 陣列名[ ]={值,值,值…};
陣列預設值是0
注意:
陣列下標是從0開始的,注意不要賦值或訪問越界。
比如:陣列的長度是2,就只能給下標0、1賦值。如果超出了就會報訪問越界錯誤。
二維陣列:
二維陣列就是一個行列結果。
一維陣列存放資料方式:{1,2,3,4,5…}
二維陣列存放資料方式:{{1,2},{3,4},{5,6}…}
定義二維陣列:
資料型別 陣列名[ ][ ]=new 資料型別[行數 ][列數 ];
給值:
陣列名[ 下標][下標 ]=值; 如:arr[ 0][0 ]=1;
int arr[][] = new int[3][4];//3,4代表3行4列 for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { arr[i][j] = i + j; } } for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { System.out.print(arr[i][j] + "\t"); } System.out.println(); }
執行結果:
排序:
1.氣泡排序
int arr[] = {11,3,30,42,35,6}; //3 6 11 30 35 42 /** 3 11 3 11 30 3 11 30 42 3 11 30 35 42 3 11 30 35 6 【42】 for(int j=0; j<6; j++) { for(int i=0 ;i<arr.length-1-j; i++) { //i ==4 if(arr[i] > arr[i+1]) { //arr[5] int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } }
2.選擇排序
100,2,3,23,66,98,18,50
默認了0 位置上的數最大 100 zuidaxiabiao = 0 zuidashu = 100
0 和 1 位置上的數比較,發現0大, 不換
0 和 2位置上的數比較, 發現 0大,不換
。。。。。。
0 和 7比較, 0比較大,0和7交換位置
50 2 3 23 66 98 18 100
選擇排序的精髓就是我們只換下標,不直接換實際的數,這樣可以減少更換的次數,從而提高效率
public void xuanZhePaiXu() {
/**
{1,3,2,66,23,98,18,50}
1 ,3,2,66,23,98,18,50
100,2,3,23,66,98,18,50
氣泡排序 -- 每一次都要進行交換,效率很低下
選擇排序
默認了0 最大 100 zuidaxiabiao = 0 zuidashu = 100
0 和 1 位置上的數比較,發現0大, 不換
0 和 2位置上的數比較, 發現 0大,不換
。。。。。。
0 和 7比較, 0比較大,0和7交換位置
50 2 3 23 66 98 18 100
預設0最大 zuidaxiaobiao=0 zuidashu= 50
0 和 1 比較 0最大
。。。。
0 和4比較 4比較大 預設4最大
4 和5比較 5比較大 預設5最大
5 和 6比較 5比較大 5和6就交換位置
**/
int arr[] = new int[50000];
for(int i=0; i<arr.length; i++) {
arr[i] = new Random().nextInt(100000);
}
Arrays.sort(arr);
for(int i=0; i<arr.length; i++) {
int zuidaxiabiao = 0;
int zuidashu = arr[0]; // 100
for(int j=1; j<arr.length; j++ ) {
if(zuidashu > arr[j]) {
//預設的0大
}else {
zuidaxiabiao = j;
zuidashu = arr[j];
}
if( j == arr.length-1-i) {
int temp = arr[zuidaxiabiao];
arr[zuidaxiabiao] = arr[j];
arr[j] = temp;
}
}
}
}
3.插入排序:
插入排序的理念就是先把陣列的第一個數作為一個數組,而是已經排序好的,從第二個開始去,通過和第一個陣列元素比較,選擇插入該資料到第一個陣列的合適位置
{100,3,2,660,23,98,18,50}
public void chaRuPaiXu() {
/**
{[,3,2,66,23,98,18],[50]}
插入排序:
把當前陣列拆分成兩個陣列:
{【,,,,】,【1,2,3,18,23,50,66,98】}
{[,3,2,66,23,98,18],[50]}
,2,66,23,98,18,1,50
2,66,23,98,18,1,3,50
{100,3,2,660,23,98,18,50}
[100] [100,2,660,23,98,18,50]
num = 3
【2,3】【100,660,23,98,18,50】
num = 2
【2,3,100】【660,23,98,18,50】
660
【2,3,23,100】,【660,98,18..】
23
【2,3,23,100,660】【,98,18..】
**/
int arr[] = new int[100000];
for(int i=0; i<arr.length; i++) {
arr[i] = new Random().nextInt(100000);
}
for(int i=1; i<arr.length; i++) { // i = 3
int j = i; //j=4
int num = arr[i]; //num = 23
while(j>0&& num<arr[j-1]) { // arr[3] = 660
arr[j] = arr[j-1]; //
j--; //
}
arr[j] = num; //2 3 100 660 23
}
}
但是,這些我們編寫的演算法效率都很低下,java預設使用二叉樹排序,效率很高,所以一般我們隊陣列進行排序都使用java的工具排序
//java自帶排序演算法
Arrays.sort(arr);
二分查詢法,二分查詢法的原理就是將陣列進行排序,然後在通過和中間數的對比大小,判斷我們要查詢的資料時在左邊還是右邊,依次迴圈,從而放棄原來逐個比較的原則
public void erFenChaZhao() {
int arr[] = {2,66,23,98,18,1,3,50};
//100000000000 52
// 0 1 2 3 4 5 6 7
// 9 > #
//(4+7)/2 = 3
/*
for(int i=0 ;i<arr.length; i++) {
if(arr[i] == 9) {
System.out.println("9這個數在"+i+"位置上!");
}
}
*/
Arrays.sort(arr);
for(int i=0 ;i<arr.length; i++) {
System.out.println(arr[i]);
}
//{1,2,3,18,23,50,66,98};
int n = 66;
int zuobian = 0;
int youbian = arr.length; // 7
for(int i=0;i<arr.length; i++) {
int zhongjian = (zuobian + youbian)/2;
int num = arr[zhongjian]; //18
if(n>num) {
zuobian = index-1;
}else if(n<num) {
youbian = index+1;
}else {
System.out.println(n+"在低" +zhongjian +"個位置");
break;
}
}
}