數組、排序和查找 數組 數組介紹 數組可以存放多個同一類型的數據。數組也是一種數據類型,是引用類型。即:數組就是一組數據 數組快速入門 //1. double[]表示是double類型的數組,數組名hens //2.{3,5,1,3.4,2,50}表示數組的值/元素,依次表示數組的 //第幾個元素 ...
數組、排序和查找
數組
數組介紹
數組可以存放多個同一類型的數據。數組也是一種數據類型,是引用類型。即:數組就是一組數據
數組快速入門
//1. double[]表示是double類型的數組,數組名hens
//2.{3,5,1,3.4,2,50}表示數組的值/元素,依次表示數組的
//第幾個元素
//
double[] hens = {3,5,1,3.4,2,50};
//遍曆數組得到數組的所有元素的和,使用for
//1.我們可以通過 hens[下標]來訪問數組的元素
//下標是從日開始編號的比如第一個元素就是 hens[o]
//第2個元素就是 hens[1],依次類推
//2.通過for就可以迴圈的訪問數組的元素/值
//老師提示:可以通過數組名·length得到數組的大小/長度
System.out.println("數組的長度=" + hens.length);
for( int i = 0; i < 6; i++){
System.out.println("第"+(i+1)+"個元素的值=" + hens[i]);
}
數組的使用
●使用方式1-動態初始化
數組的定義
數據類型數組名=new 數據類型[大小]
int a[]=new int[5];//創建了一個數組,名字a,存放5個int
●使用方式2-動態初始化
√先聲明數組
語法:數據類型數組名;也可以數據類型[數組名;
int a[];或者int[] a;
√創建數組
語法:數組名=new數據類型[大小;
a=new int[10];
√案例演示【前面修改即可】
//(2)第2種動態分配方式,先聲明數組,再new分配空間
double scores[] ;//聲明數組,這時scores是null
scores = new double[5];// 分配記憶體空間,可以存放數據
●使用方式3-靜態初始化
初始化數組
語法:數據類型 數組名[]={元素值,元素值...)
int a[]={2,5,6,7,8,89,90,34,5,6},如果知道數組有多少元素,具體值上面的用法相當於:
int a[=new int[9];
a[0]=2;a[1]=5;a[2]=6; a[3]=7;a[4]=8;
a[5]=89;a[6]=90;a[7]=34;a[8]=56;
√快速入門案例【養雞場】
double hensl={3.5.1.3.4.2.50];等價
double hens[ = new double[6];
hens[0] = 3; hens[1] = 5; hens[2] = 1; hens[3] = 3.4; hens[4]=2;hens[5] = 50;
數組使用註意事項和細節
- 數組是多個相同類型數據的組合,實現對這些數據的統一管理
- 數組中的元素可以是任何數據類型,包括基本類型和引用類型,但是不能混用。
- 數組創建後,如果沒有賦值,有預設值int 0, short 0, byte 0, long 0, float 0.0,double 0.0, char \u0000,boolean false,String null
- 使用數組的步驟1.聲明數組並開闢空間2.給數組各個元素賦值3.使用數組
- 數組的下標是從0開始的。
- 數組下標必須在指定範圍內使用,否則報:下標越界異常,比如 int[] arr=new int[5];則有效下標為0-4
- 數組屬引用類型,數組型數據是對象(object)
數組賦值機制
- 基本數據類型賦值,這個值就是具體的數據,而且相互不影響。
int n1 = 2; int n2 =n1; - 數組在預設情況下是引用傳遞,賦的值是地址。看一個案例,並分析數組賦值的記憶體圖(重點)。
int[] arr1 = {1,2,3};
int[] arr2 = arr1;
//基本數據類型賦值,賦值方式為值拷貝
//n2的變化,不會影響到n1的值
int n1 = 10;
int n2 = n1;
n2 = 80;
System.out.print1n( "n1=" +n1);//10
System.out.print1n( "n2=" + n2);//80
//數組在預設情況下是引用傳遞,賦的值是地址,賦值方式為引用賦值
//是一個地址, arr2變化會影響到arr1
int[]arr1 = {1,2,3};
int[]arr2 = arr1;//把arr1賦給arr2
arr2[0] = 10;
//看看arr1的值
System.out.println( "====arr1的元素====");for(int i = 0; i < arr1.length; i++){
System.out.println(arr1[i]);
}
JVM記憶體情況圖
數組拷貝
編寫代碼實現數組拷貝(內容複製)
將int[l] arr1 = {10,20,30};拷貝到arr2數組,要求數據空間是獨立的.
int[] arr1 = {10,20,30};
//創建一個新的數組arr2,開闢新的數據空間
//大小arr1.length;
int[] arr2 = new int[arr1.length];
//逼歷arr1 ,把每個元素拷貝到arr2對應的位置
for(int i = 0; i < arr1.length; i++){
arr2[i] = arr1[i];
}
數組擴容
Scanner myScanner = new Scanner(System.in);//初始化數組
int[]arr = {1,2,3};
do{
int[]arrNew = new int[arr.length + 1];
//遍歷arr數組,依次將arr的元素拷貝到arrNew數組
for(int i =0; i< arr.length; i++){
arrNew[i] = arr[i];
}
System.out.println("請輸入你要添加的元素");
int addNum = myScanner.nextInt();
//把addNum賦給arrNew最後一個元素
arrNew[ arrNew.length - 1] = addNum;
//讓arr指向arrNew,
arr = arrNew;
//輸出arr看看效果
System.out.println("====arr擴容後元素情況====");
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + "\t");
}
//問用戶是//問用戶是否繼續
System.out.println("是否繼續添加y/n");
char key = myScanner.next( ).charAt(0);
if( key =='n'){//如果輸入n,就結束
break;
}
}while(true);
System.out.println("你退出了添加...");
排序
排序是將一群數據,依指定的順序進行排列的過程。排序的分類:
- 內部排序:
指將需要處理的所有數據都載入到內部存儲器中進行排序。包括(交換式排序法、選擇式排序法和插入式排序法); - 外部排序法:
數據量過大,無法全部載入到記憶體中,需要藉助外部存儲進行排序。包括(合併排序法和直接合併排序法)。
冒泡排序法
冒泡排序(Bubble Sorting)的基本思想是:通過對待排序序列從後向前(從下標較大的元素開始),依次比較相鄰元素的值,若發現逆序則交換,使值較大的元素逐漸從前移向後部,就象水底下的氣泡一樣逐漸向上冒。
冒泡排序法案例:
下麵我們舉一個具體的案例來說明冒泡法。我們將五個無序:24,69,80,57,13使用冒泡排序法將其排成一個從小到大的有序數列。
總結冒泡排序特點
1.我們一共有5個元素
2.一共進行了4輪排序,可以看成是外層迴圈
3.每1輪排序可以確定一個數的位置,比如第1輪排序確定最大數,第2輪排序,確定第2大的數位置,依次類推
4.當進行比較時,如果前面的數大於後面的數,就交換
5.每輪比較在減少4->3->2->4分析思路-→>代碼..
查找
●介紹:
在java中,我們常用的查找有兩種:
1.順序查找
2.二分查找【二分法,我們放在演算法講解】
●案例演示:
1.有一個數列:白眉鷹王、金毛獅王、紫衫龍王、青翼蝠王猜數游戲:從鍵盤中任意輸入一個名稱,判斷數列中是否包含此名稱【順序查找】要求:如果找到了,就提示找到,並給出下標值。
//定義一個字元串數組
String[] names = {"白眉鷹王","金毛獅王","紫衫龍王","青翼蝠王"};
Scanner myScanner = new Scanner(System.in);
System.out.println("請輸入名字");
String findName = myScanner.next();
//逼曆數組,逐一比較,如果有,則提示信息,並退出//這裡老師給大家一個編程思想
int index = -1;
for(int i = 0; i < names.length; i++){
//比較字元串比較equals,如果要找到名字就是當前元素
if(findName.equals(names[i])){
System.out.println("恭喜你找到"+ findName);
System.out.println("下標為 " + i);
//把i保存到index
index = i;
break;//退出
}
}
if(index == -1){//沒有找到
System.out.println("sorry ,沒有找到" + findName);
}
2.請對一個有序數組進行二分查找{1,8,10,89,1000,1234},輸入一個數看看該數組是否存在此數,並且求出下標,如果沒有就提示"沒有這個數”。
答案:略
多維數組
多維數組我們只介紹二維數組。
二維數組
●二維數組的應用場景
比如我們開發一個五子棋游戲,棋盤就是需要二維數組來表示。
//1。從定義形式上看int[][]
//2.可以這樣理解,原來的一維數組的每個元素是一維數組,就構成二維數組
int[][ ]arr = { {0,0, 0,0,0,0},
{0,0,1,0,0,0},
{0,2,0,3,0,0},
{0,0,0,0,0,0}};
//輸出二維圖形
for(int i = 0; i < arr.length; i++){
//逼歷二維數組的每個元秦
//逼歷二維數組的每個元素(數組)
//老韓解讀
//1. arr[i]表示二維數組的第i+1個元秦比如arr[0]∶二維數組的第一個元秦
//2. arr[i].length得到對應的每個一維數組的長度
for(int j = 0; j <arr[i].length; j++){
System.out.print(arr[i][j] + "\t");//輸出了一維數組
}
System.out.println();//換行
}
使用方式1:動態初始化
-
語法:類型[][] 數組名=new 類型[大小][大小]
-
比如: int[][] a[][]=new int[2][3]
-
使用演示
-
二維數組在記憶體的存在形式
使用方式2:動態初始化
-
先聲明:類型數組名[][];
-
再定義(開闢空間) 數組名=new 類型[大小][大小]
-
賦值(有預設值,比如int 類型的就是0)
-
使用演示
int arr[][];//聲明二維數組 arr = new int[2][3];//再開空間
使用方式3:動態初始化-列數不確定
- 看一個需求:動態創建下麵二維數組,並輸出。
-
完成該案例
-
畫出執行分析示意圖
int[][] arr = new int[3][];//創建二維數組,但是只是確定一維數組的個數 for(int i = 0; i < arr.length; i++){//逼歷arr每個一維數組 //給每個一維數組開空間new //如果沒有給一維數組new,那麼、arr[i]就是null arr[i] = new int[i + 1]; //遍歷一維數組,並給一維數組的每個元素賦值 for(int j = 0;j < arr[i].length; j++){ arr[i][j] = i + 1;//賦值 } } System.out.println( "=====arr元素=====");//逼歷arr輸出 for(int i = 0; i < arr.length; i++){ //輸出arr的每個一維數組 for(int j = 0; j < arr[i].length; j++){ System.out.print(arr[i][i]+" "); } System.out.println();//換行 }
使用方式4:靜態初始化
-
定義類型數組名[]={{值1,值2..},{值1,值2..},{值1,值2..}}
-
使用即可[固定方式訪問]
比如:
int[][] arr = {{1,1,1), {8,8,9}, {100});
解讀
- 定義了一個二維數組arr
- arr有三個元素(每個元素都是一維數組)
- 第一個一維數組有3個元素,第二個一維數組有3個元素,第三個一維數組有1個元素
二維數組使用細節和註意事項
- 一維數組的聲明方式有:
int[] 或者int x[] - 二維數組的聲明方式有:
int[][]y或者int[] y[]或者int y[][] - 二維數組實際上是由多個一維數組組成的,它的各個一維數組的長度可以相同,也可以不相同。比如:map[[]是一個二維數組
int map[][] = {{1,2},{3,4,5}}
由map[0]是一個含有兩個元素的一維數組,map[1]是一個含有三個元素的一維數組構成,我們也稱為列數不等的二維數組。