Java入門-第四節(陣列以及陣列排序)
有時在寫一些程式時,我們要儲存幾百甚至幾千個資料,這時候如果用定義變數的方式儲存資料是很難的,為了解決這個問題,Java提供了陣列的資料結構,可以當作一個容器來儲存許多個數據。
1、陣列的概念
陣列是相同資料型別的資料按順序組成的一種引用資料型別。
宣告陣列:String[] arr;
double[][] arr;
宣告陣列僅僅給出了資料型別和陣列的名字,要真正的使用陣列我們還要例項化陣列,例項化陣列就是申請了一段連續的記憶體空間用來儲存陣列的元素,例項化陣列語法格式:陣列名=new陣列元素資料型別[陣列元素個數];
窮舉法例項化陣列:資料型別 [] 陣列名={陣列元素,陣列元素};
二維陣列:實質是一維陣列。
陣列定義:陣列型別 [][] 陣列名 = new 陣列型別[一維陣列的個數][每一個一維陣列中元素個數];
2、遍歷陣列元素
傳統for迴圈遍歷一維陣列:
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);}
傳統for迴圈遍歷二維陣列:
int [][] arr={{1,2,3,4,5},{1,2,3,3,3},{4,1,4,1,4}}; for(int i=0;i<arr.length;i++){ for(int j=0;j<arr[].length;j++){ System.out.println(arr[i][j]); } }
加強for迴圈遍歷一維陣列:
int [] arr={1,2,3,4,5}; for(int a:arr){ System.out.println(a); }
加強for迴圈遍歷二維陣列:
int [][] arr={{1,2,3,4,5},{1,2,3,3,3},{4,1,4,1,4}};
for(int a[]:arr){
for(int b:a){
System.out.println(b);
}
}
3、陣列的排序!
(1)選擇排序:
選擇排序就是先遍歷陣列找到最大或最小的數和第一個互換
int [] arr= {1211,234,234,4,2,3,23,42,345,2,345,234,5,34,5,3}; for(int i=0;i<arr.length;i++) { int k=i; for(int j=i;j<arr.length;j++) {//迴圈找出最大數 if(arr[j]>arr[k]) k=j; } int temp=arr[i];//交換 arr[i]=arr[k]; arr[k]=temp; }
(2)氣泡排序:
氣泡排序法是最基本的排序法之一,氣泡排序法的執行機制是通過迴圈遍歷元素並調整相鄰元素順序來實現的一種簡單排序方法。 int [] arr= {1211,234,234,4,2,3,23,42,345,2,345,234,5,34,5,3};
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr.length-i-1;j++) {
if(arr[j]>arr[j+1]) {
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
(3)插入排序:
每迴圈一次都將一個待排序的元素所對應的資料按其順序大小插入到前面已經排序的序列的合適位置,直到全部插入排序完為止,其難點在於如何在前面已經排好序的序列中找到合適的插入位置。
int [] arr= {1211,234,234,4,2,3,23,42,345,2,345,234,5,34,5,3};
for(int i=1;i<arr.length;i++){//i為待排序資料的下標,由於將第一個元素是有序的,所以i從1開始;i<array:這樣才能遍歷完後續陣列,進而實現全部排序;
int willSortData=arr[i];//將待排序資料儲存到變數willSortData中
int j=0;
for(;j<i;j++){//j<i:和待排序資料前面(i)的所有元素進行比較,以找到“應該”插入的下標位置。
if(willSortData<arr[j]){//如果條件成立意味著待插入資料小於其前面的某個元素值
break;//當if條件成立時就找到了該待插入資料“應該”插入的下標位置,所以這時必須終止迴圈
}
}//for迴圈執行結束意味著找到了待插入資料“應該”插入的下標位置
if(i==j){//i與j相等意味著不用排序,下面程式碼也不用執行
continue;//停止不用排序這次迴圈,進入下次迴圈
}
for(int k=i;k>j;k--){//int k=i:待插入資料所在位置就是元素後移開始的下標位置
arr[k]=arr[k-1];//元素後置
}
arr[j]=willSortData;
}//該迴圈體每迴圈完一次就代表著本次待插入資料已經和前面元素是有序的了
插入排序的實質:
將陣列分為有序區和無序區,定義一個標記無序區第一個元素的定位變數,將該元素與前面的有序區內元素遍歷比較,找到該元素應該插入位置,然後將應插入位置到待插入元素所在位置之間的元素後移一位,最後再將待插入元素插入到應插入的位置,有序區擴增一位,無序區減少一位,定位變數再次後移,鎖定後面無序區第一位元素位置。
4、值傳遞與引用傳遞
值傳遞(pass by value)是指在呼叫函式時將實際引數 複製 一份傳遞到函式中,這樣在函式中如果對 引數 進行修改,將不會影響到實際引數。
public class Test {
public static void main(String[] args) {
int x=10;
test(x);
System.out.println(x);//輸出10
}
public static void test(int y) {
y=0;
}
}
引用傳遞(pass by reference)是指在呼叫函式時將實際引數的地址 直接 傳遞到函式中,那麼在函式中對 引數 所進行的修改,將影響到實際引數。
public class Test {
public static void main(String[] args) {
int [] x= {10};
test(x);
System.out.println(x[0]);//輸出0
}
public static void test(int [] y) {
y[0]=0;
}
}
5、陣列元素查詢
二分法查詢:搜尋資料與有序陣列(比如升序)中間元素比較以確定在中間元素左邊還是右邊,如果在右邊,則調整最小搜尋索引值,然後進入下次迴圈;如果在左邊,則調整最大搜索索引值,然後進入下次迴圈;如果相等則當前位置就是查詢資料所在位置,停止迴圈;
程式碼:
int [] arr= {1,2,3,4,5,6,7,8,9,10};
int a=1,low=0,high=arr.length-1,middle=(low+high)/2;
while(low<=high) {
middle=(low+high)/2;
if(a==arr[middle]) {
System.out.println("yes");
break;
}else if(a>arr[middle]) {
low=middle+1;
}else {
high=middle-1;
}
}
if(a!=arr[middle]) {
System.out.println("no");
}
如果找到待查證數,列印yes,否則no。