JAVA进阶级开发之(Array工具类)
目錄
常見(jiàn)的算法:
1、排序算法:
2、查找算法:
3、算法:
4、冒泡排序算法(理論)
4、選擇排序算法(理論)
5、數(shù)組的元素查找:
6、介紹一下java.util.Arrays工具類
?
?
我們學(xué)習(xí)數(shù)組的時(shí)候,需要對(duì)數(shù)組的數(shù)據(jù)進(jìn)行一下處理,例如排序和查找這種簡(jiǎn)單的原理我們需要去學(xué)會(huì)怎么去用自己寫(xiě)的代碼去運(yùn)行,
但是呢!JAVA的類庫(kù)里面其實(shí)已經(jīng)封裝好了一個(gè)叫做Array的工具類,需要用到的時(shí)候就進(jìn)行調(diào)用,因此不用我們太過(guò)于去了解工具類里面的源碼,
程序員只需要知道如何調(diào)用工具類為自己服務(wù)就行,效率會(huì)提高很多!,接下來(lái)先了解一下常見(jiàn)的數(shù)組算法和Array工具類
?
數(shù)組:
常見(jiàn)的算法:
?
1、排序算法:
冒泡排序算法
選擇排序算法
?
2、查找算法:
二分法查找
?
3、算法:
實(shí)際上在java中不需要精通算法,因?yàn)閖ava中已經(jīng)封裝好了算法,要排序的時(shí)候就進(jìn)行調(diào)用方法就行
例如:
java中提供了一個(gè)數(shù)組工具類
java.util.Arrays
Array工具類
既然是工具類,意味著java已經(jīng)幫助程序員完成了封裝等工作,這個(gè)工具類是帶有static關(guān)鍵字的,因此調(diào)用的時(shí)候不需要頻繁的new對(duì)象,直接類名.進(jìn)行調(diào)用即可
可以在idea中雙敲shift鍵位,調(diào)出搜索框后輸入 Arrarys 找到此類即可
其中有一個(gè)sort() 方法,可以排序
這個(gè)方法是靜態(tài)方法,直接使用類名調(diào)用就行
?
注意:工具類中的方法大部分是靜態(tài)方法
?
4、冒泡排序算法(理論)
參與比較的數(shù)據(jù):9 8 10 7 6 0 11
第一次循環(huán):
8 9 10 7 6 0 11(1次比較:交換)
8 9 10 7 6 0 11(2次比較:不交換)
8 9 7?10 6 0 11(3次比較:交換)
8 9 7 6 10 0 11(4次比較:交換)
8 9 7 6 0 10 11(5次比較:不交換)
8 9 7 6 0 10 11(6次比較:交換)
最終冒出最大數(shù)據(jù)在右邊:11
此時(shí)參與比較的數(shù)據(jù):8 9 7 6 0 10
第二次循環(huán):
8 9 7 6 0 10(1次比較:不交換)
8 7 9 6 0 10(2次比較:交換)
8 7 6 9 0 10(3次比較:交換)
8 7 6 0 9 10(4次比較:交換)
8 7 6 0 9 10(5次比較:不交換)
此時(shí)參與比較的數(shù)據(jù):8 7 6 0 9
第三次循環(huán):
7 8 6 0 9(1次比較:交換)
7 6 8 0 9(2次比較:交換)
7 6 0 8 9(3次比較:交換)
7 6 0 8 9(4次比較:不交換)
此時(shí)參與比較的數(shù)據(jù):7 6 0 8
第四次循環(huán):
6 7 0 8(1次比較:交換)
6 0 7 8(2次比較:交換)
6 0 7 8(3次比較:不交換)
此時(shí)參與比較的數(shù)據(jù):6 0 7
第五次循環(huán):
0 6 7(1次比較:交換)
0 6 7(2次比較:不交換)
此時(shí)參與比較的數(shù)據(jù):0 6
第六次循環(huán):
0 6(1次比較:不交換)
?
演示冒泡算法的代碼:
package com.lbj.javase.array;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.array* @date 2021/2/23 22:08* @Copyright 公司*/ public class BubbleSort {public static void main(String[] args) {int[] array1={9,8,10,7,6,0,11};//使用冒泡算法進(jìn)行排序 // for (int i = 0; i <array1.length-1;i++) { // // }//上面使用的循環(huán)體不如下面使用的效果,其實(shí)原理是一樣的//外層控制循環(huán)次數(shù),內(nèi)層控制比較次數(shù)for (int i = array1.length-1; i >0; i--) {for (int j = 0; j <i; j++) {if (array1[j]>array1[j+1]){//用一個(gè)臨時(shí)數(shù)據(jù)保存交換數(shù)據(jù)int temp;temp=array1[j];array1[j]=array1[j+1];array1[j+1]=temp;}}}//完成循環(huán)后,遍歷輸出冒泡算法排序好的數(shù)組for (int i = 0; i <array1.length; i++) {System.out.println(array1[i]);}} }?
?
?
?
4、選擇排序算法(理論)
選擇排序比冒泡排序的效率高
高在交換位置的次數(shù)上
選擇排序的交換位置是有意義的
?
循環(huán)一次,然后找出參加比較的這堆數(shù)據(jù)中最小的,拿著這個(gè)最小的值和最前面的數(shù)據(jù)交換位置
?
參與比較的數(shù)據(jù):3 1 6 2 5(這一堆參與比較的數(shù)據(jù)中最左邊的元素下標(biāo)是0)
第一次循環(huán)之后的結(jié)果是:
1 3 6 2 5
?
參與比較的數(shù)據(jù):3 6 2 5(這一堆參與比較的數(shù)據(jù)中最左邊的元素下標(biāo)是1)
第二次循環(huán)之后的結(jié)果是:
2 6 3 5
?
參與比較的數(shù)據(jù):3 6 5(這一堆參與比較的數(shù)據(jù)中最左邊的元素下標(biāo)是2)
第三次循環(huán)之后的結(jié)果是:
3 6 5
?
參與比較的數(shù)據(jù):6? 5(這一堆參與比較的數(shù)據(jù)中最左邊的元素下標(biāo)是3)
第四次循環(huán)之后的結(jié)果是:
5 6
?
注意:5條數(shù)據(jù),循環(huán)4次
?
上機(jī)演示:
package com.lbj.javase.array;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.array* @date 2021/3/2 16:09* @Copyright 公司* 關(guān)鍵點(diǎn):選擇排序的關(guān)鍵在于,你怎么找出一堆數(shù)據(jù)中最小的*/ public class SelectSort {public static void main(String[] args) {int[] array1={3,1,6,2,5};//count用來(lái)計(jì)算比較次數(shù)int count=0;int count2=0;//選擇排序//5條數(shù)據(jù)循環(huán)4次(外層循環(huán)4次)for (int i = 0; i <array1.length-1; i++) {//i的值是0 1 2 3//i正好是參加比較的這堆數(shù)據(jù)中,最左邊那個(gè)元素的下標(biāo)//i是一個(gè)參與比較的這堆數(shù)據(jù)中心的起點(diǎn)下標(biāo)//假設(shè)起點(diǎn)i下標(biāo)位置上的元素是最小的(關(guān)鍵點(diǎn)),這一步是為了把min最小值確定下來(lái)int min = i;for (int j = i + 1; j < array1.length; j++) {//count是用來(lái)計(jì)算元素的比較次數(shù)count++;if (array1[j] < array1[min]) {//如果if()里面的內(nèi)容成立,那么此時(shí)最小值的元素是jmin = j;}}//當(dāng)i和min相等時(shí),表示最初猜測(cè)是對(duì)的//當(dāng)i和min不相等時(shí),表示最初猜測(cè)是錯(cuò)的,有比這個(gè)元素更小的元素//需要拿著這個(gè)更小的元素和左邊的元素交換位置if (min != i) {//表示存在更小的數(shù)據(jù)//arrary1[min] 最小的數(shù)據(jù)//arrary1[i] 最前面的數(shù)據(jù)int temp;temp = array1[min];array1[min] = array1[i];array1[i] = temp;//統(tǒng)計(jì)交換位置的次數(shù)count2++;}}//冒泡排序和選擇排序比較的次數(shù)沒(méi)變//交換位置的次數(shù)減少了System.out.println("比較次數(shù)"+count);System.out.println("交換次數(shù)"+count2);//遍歷輸出排序好的數(shù)組for (int j = 0; j < array1.length; j++) {System.out.println(array1[j]);}}}結(jié)果:
?
?
5、數(shù)組的元素查找:
數(shù)組的元素查找有兩種方式:
第一種方式:一個(gè)一個(gè)找,直到找到為止
第二種方式:二分法算法查找,效率較高
?
第一種方式示例:
package com.lbj.javase.array;public class ArraySearch {public static void main(String[] args) {int[] arr={1,2,3,4,5,6};//需求,要求找出數(shù)組元素為5的下標(biāo)//用第一種方式,一個(gè)個(gè)找for (int i = 0; i <arr.length; i++) {if (arr[i]==5){System.out.println("找到數(shù)據(jù)5的下標(biāo)為"+i);return;}}System.out.println("找不到數(shù)據(jù)為5");} }第一種方法改進(jìn)(封裝成為方法):
package com.lbj.javase.array;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.array* @date 2021/3/2 20:43* @Copyright 公司** 數(shù)組的元素查找* 數(shù)組的元素查找有兩種方式:* 第一種方式:一個(gè)一個(gè)找,直到找到為止* 第二種方式:二分法算法查找,效率較高*/ public class ArraySearch {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5, 6};//需求,要求找出數(shù)組元素為5的下標(biāo)//用第一種方式,一個(gè)個(gè)找 // for (int i = 0; i <arr.length; i++) { // if (arr[i]==5){ // System.out.println("找到數(shù)據(jù)5的下標(biāo)為"+i); // return; // } // } // System.out.println("找不到數(shù)據(jù)為5");//改進(jìn):最好以上的程序封裝一個(gè)方法//思考:傳什么參數(shù)?返回什么值?//傳什么:第一個(gè)參數(shù)是數(shù)組,第二個(gè)參數(shù)是被查找的元素//返回值:返回被查找這個(gè)元素的下標(biāo),如果找不到就返回-1表示不存在int index = arraySearch(arr, 5);System.out.println("你想找的元素5下標(biāo)為"+index);if (index == -1) {System.out.println("你想找的數(shù)組不存在");}}/*** 從數(shù)組中檢索某個(gè)元素的下標(biāo)* @param arr 被檢索的數(shù)組* @param ele 被檢索的元素* @return 大于等于0的數(shù)表示元素的下標(biāo),-1表示該元素不存在*/public static int arraySearch(int[] arr, int ele) {for (int i = 0; i < arr.length; i++) {if (ele == arr[i]) {return i;}}return -1;} }?
?
第二種方式(二分法查找):
一維數(shù)組int[ ] arr={10(下標(biāo)0),11,12,13,14,15,16,17,18,19,20(下標(biāo)10)};? ? ? ? ? ? ? ? ? ? ? ?偽代碼
要求:通過(guò)二分法查找,找出18這個(gè)元素的下標(biāo)
(0+10)/2? ? ? ? ? ? ? ? ?--> 算出中間元素的下標(biāo):5
?
拿著中間這個(gè)元素和目標(biāo)要查找的元素進(jìn)行對(duì)比:
中間元素是:arr[5]? ?--> 15
由于:15<18? ? ? ? ? 18是被查找的元素
被查找的元素18在目前中間元素15的右邊
所以開(kāi)始元素的下標(biāo)從0變成(5+1)
?
再重新計(jì)算一個(gè)中間元素的下標(biāo):
開(kāi)始下標(biāo)是:5+1
結(jié)束下標(biāo)是:10
計(jì)算:(6+10)/2? ? --> 8
8下標(biāo)對(duì)應(yīng)的元素arr[8]剛好是18
找到的中間元素正好和被找的元素18相等,表示找到了,下標(biāo)為8
?
注意:
二分法查找算法是基于排序的基礎(chǔ)上的(沒(méi)有排序好的數(shù)組不能用二分法查找)
?
二分法查找終止條件:
一直折半,直到中間的那個(gè)元素恰好是被查找的元素
?
缺點(diǎn):
如果一個(gè)元素剛好一直在最后一個(gè),二分法會(huì)很浪費(fèi)系統(tǒng)資源查找
?
上機(jī)演示:
package com.lbj.javase.array;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.array* @date 2021/3/4 20:32* @Copyright 公司*/ public class ArrayUtil {public static void main(String[] args) {int[] arr={2,5,6,8,9,12,23,45,56,78,89};//使用二分法查找元素5的下標(biāo)int index=binarySearch1(arr,6);System.out.println(index==-1?"該元素不存在":"該元素6的下標(biāo)為"+index);}public static int binarySearch1(int[] arr, int ele) {//開(kāi)始元素的下標(biāo)int begin=0;//結(jié)束元素的下標(biāo)int end=arr.length-1;//開(kāi)始元素下標(biāo)只要在結(jié)束元素下標(biāo)的左邊,就有機(jī)會(huì)繼續(xù)循環(huán)while (begin<=end){//中間元素的下標(biāo)int mid=(begin+end)/2;if (arr[mid]<ele){//目標(biāo)元素在中間元素右邊//重新賦值begin=mid+1;}else if (arr[mid]==ele){//目標(biāo)元素和中間元素相等return mid;}else if (ele<arr[mid]){//目標(biāo)元素在中間元素左邊end=mid-1;}}return -1;} }?
實(shí)驗(yàn)結(jié)果:
?
?
6、介紹一下java.util.Arrays工具類
工具類里面所有方法都是靜態(tài)方法,直接類名.工具類方法,進(jìn)行調(diào)用
主要使用的是兩個(gè)方法:二分法查找,排序
以后要學(xué)會(huì)自己看開(kāi)發(fā)文檔,不要死記硬背
?
上機(jī)演示:
package com.lbj.javase.array;import java.util.Arrays;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.array* @date 2021/3/5 12:08* @Copyright 公司*/ public class ArrayTest12 {public static void main(String[] args) {int[] arr={3,5,6,9,12,32,54,4,8,9};//使用工具類對(duì)數(shù)組進(jìn)行排序Arrays.sort(arr);//遍歷輸出for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}//使用工具類對(duì)數(shù)組進(jìn)行二分法查找(建立在已經(jīng)排序完成的基礎(chǔ)上)int index=Arrays.binarySearch(arr,8);System.out.println(index==-1?"數(shù)組中沒(méi)有此數(shù)據(jù)":"數(shù)組中元素8的下標(biāo)是"+index);}}?
?
演示結(jié)果:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的JAVA进阶级开发之(Array工具类)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux下安装VIM编辑器,以及简单的
- 下一篇: 为什么买入不了创业版_详解实战抄底——如