- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- java數組算法例題代碼詳解(冒泡排序,選擇排序,找
第一個(gè)和最后一個(gè)互換,第二個(gè)和倒數第二個(gè)互換,就相當于把數組想下圖一樣,進(jìn)行對折互換,如果數組個(gè)數為奇數,則中間保持不變其余元素互換即可
import java.util.Arrays; class Demo12 { public static void main (String[] args) { int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; System.out.println(Arrays.toString(arr)); reverse(arr); System.out.println(Arrays.toString(arr)); } /** * 數組逆序 * @param arr */ public static void reverse(int[] arr) { for (int i = 0; i < arr.length / 2; i++) { int temp = arr[arr.length - 1 - i]; arr[arr.length - 1 - i] = arr[i]; arr[i] = temp; } } }
數組展示:System.out.println(Arrays.toString(arr));
因為是找下標位置所以可以先定義一個(gè)值為數組下標,直接使用 數組[下標] 方式進(jìn)行比較
import java.util.Arrays; class Demo13 { public static void main (String[] args) { int[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // 輸出數組 System.out.println(Arrays.toString(array)); maxIndexOf(array); } /** * 找到數組中最大的數并且輸出 * @param arr */ public static void maxIndexOf (int[] arr) { int maxIndex = 0; // i 可以從1開(kāi)始,不需要maxIndex和自己再比較一次 for (int i = 1; i < arr.length; i++) { if (arr[i] > arr[maxIndex]){ maxIndex = i; } } System.out.printf("最大的數為 : %d 下標為 : %d", arr[maxIndex] , maxIndex); } }
分析
import java.util.Arrays; import java.util.Scanner; class Demo14 { public static void main (String[] args) { int num = 0; int index = 0; // 定義數組 int[] array = { 4399, 327, 360, 3, 4, 11, 32, 45, 123, 86}; // 輸出數組 System.out.println(Arrays.toString(array)); // 獲取用戶(hù)輸入數據 num = getInputNum(); // 獲取用戶(hù)輸入數據在數組中第一次出現的位置 index = getIndexOfNum(array, num); // 輸出位置索引 printIndexNum(num, index); } /** * 接受用戶(hù)傳來(lái)的數據 * @return 返回接受的數據 */ public static int getInputNum () { int num = 0; java.util.Scanner sc = new Scanner(System.in); System.out.println("請輸入您要查詢(xún)的數據:"); num = sc.nextInt(); return num; } /** * 找出數組中指定元素第一次出現的下標位置 * @param array * @return 返回下標 */ public static int getIndexOfNum(int[] array, int num) { // 如果找不到數據,則默認是-1 int index = -1; for (int i = 0; i < array.length; i++) { if (array[i] == num) { index = i; break; } } return index; } /** * 輸出數據 * @param num 數組中某一項的值 * @param indexNum 索引值 */ public static void printIndexNum(int num, int indexNum) { if (indexNum == -1) { System.out.println(num + "不在數組中"); } else { System.out.println("數組中" + num + "第一次出現的下標位置 : " + indexNum); } } }
分析:有可能不存在指定的索引
import java.util.Arrays; import java.util.Scanner; class Demo15 { public static void main(String[] args) { // 下標值 int indexNum = 0; // 下標對應的數值 int num = 0; // 定義數組 int[] array = { 4399, 327, 360, 3, 4, 11, 32, 45, 123, 86}; // 輸出數組 System.out.println(Arrays.toString(array)); // 接受用戶(hù)傳來(lái)的下標值 indexNum = getIndexNum(); // 查詢(xún)數組中下標值對應的數值 num = findNumInArray(indexNum, array); // 輸出數值 printNum(indexNum, num); } /** * 接受用戶(hù)傳來(lái)的下標值 * @param indexNum 用戶(hù)傳來(lái)的下標值 * @return 下標值 */ public static int getIndexNum() { int indexNum = 0; Scanner sc = new Scanner(System.in); System.out.println("請輸入想要查詢(xún)的下標值:"); indexNum = sc.nextInt(); return indexNum; } /** * 查詢(xún)數組中下標值對應的數值 * @param indexNum 下標值 * @param array 數組 * @return 返回下標值對應的數值 */ public static int findNumInArray(int indexNum, int[] array) { int num = 0; // 判斷用戶(hù)傳來(lái)的下標值是否正確,是否越界 if (indexNum > 0 && indexNum < array.length) { num = array[indexNum]; } else { // 如果越界num值為-1 num = -1; } return num; } /** * 輸出數值 * @param num */ public static void printNum(int indexNum, int num) { if (num == -1) { System.out.println(indexNum + "索引越界"); System.exit(0); } else { System.out.println("數組中" + indexNum + "位置的元素為 : " + num); } } }
和找出第一個(gè)方法差不多
tips:
package cn.ocean888; import java.util.Arrays; import java.util.Scanner; // 找出指定元素在數組中最后一次出現位置 public class Demo1 { public static void main(String[] args) { int num = 0; int index = 0; int[] array = { 4399, 327, 360, 3, 4, 11, 32, 45, 123, 86}; System.out.print(Arrays.toString(array)); // 獲取用戶(hù)輸入 num = getInputNum(); // 找出指定元素在數組中最后一次出現位置 index = getLastIndexOf(array, num); // 輸出下標 printIndex(index); } /** * 獲取用戶(hù)輸入 * @param num 用戶(hù)輸入數字 * @return num */ public static int getInputNum() { int num = 0; Scanner sc = new Scanner(System.in); System.out.println("請輸入數組中的一個(gè)數字:"); num = sc.nextInt(); return num; } /** * 找出指定元素在數組中最后一次出現位置 * @param array * @param num */ public static int getLastIndexOf(int[] array, int num) { int index = -1; // 既然是找最后一個(gè)數字,可以倒序查找,提高效率 for (int i = array.length - 1; i >= 0 ; i--) { if (array[i] == num) { index = i; break; } } return index; } /** * 輸出下標 * @param index */ public static void printIndex(int index) { if (index != -1) { System.out.println("指定元素在數組中最后一次出現位置為:" + index); } else { System.out.println("指定元素沒(méi)有在數組中出現"); } } }
一定要注意,for循環(huán)判斷 i < array.length 不是小于等于,因為是從0開(kāi)始
要求:
思考1:
解決:
另外使用一個(gè)數組,作為形式參數,傳遞首地址,使用此數組存放下標位置,因為是傳遞的地址,可以直接更改數組內容,并不需要返回數組的值
思考2:
需要考慮保存下標的數組容量
解決:
返回值數組容量和原數組容量一致,這樣及時(shí)數組內元素值一致且被選中,也可以存儲下來(lái)
思考3:
返回值,怎么表示,用什么類(lèi)型數據
new創(chuàng )建一個(gè)新的數組,int類(lèi)型數組中,所有元素初始值都是0,用什么判斷元素索引
解決:
返回找到的元素個(gè)數,沒(méi)有則返回0
package cn.ocean888; import java.util.Arrays; public class Demo2 { public static void main(String[] args) { // 假設用戶(hù)要查詢(xún)3在數組中出現的位置 int num = 3; int count = 0; int[] array1 = { 4399, 3, 360, 3, 4, 11, 32, 3, 123, 86}; int[] array2 = new int[array1.length]; // 在array1數組查num重復值索引放到array2中 count = allIndexOf(array1, array2, num); // 打印輸出查詢(xún)3在數組中出現的位置 printArray(array2, count); // 打印輸出整個(gè)數組 System.out.println(Arrays.toString(array2)); } /** * 從元素組找到元素在指定數組中的所有下標位置,將下標位置依次賦值給array2數組 * 返回值為array2數組長(cháng)度,即有多少個(gè)重復的值 * @param array1 原數組 * @param array2 存儲重復值索引的數組 * @return conunt 有多少個(gè)重復的值 */ public static int allIndexOf(int[] array1, int[] array2, int num) { // count值既是返回時(shí)的存儲重復值索引的數組array2的長(cháng)度,也在循環(huán)中可以當作array2的索引 int count = 0; for (int i = 0; i < array1.length; i++) { if (array1[i] == num) { array2[count] = i; count++; } } return count; } /** * 打印array2數組 * @param array2 */ public static void printArray(int[] array2, int count) { for (int i = 0; i < count; i++) { System.out.println(array2[i]); } } }
在數組指定位置添加元素,指定位置后面的依次往后移一位,最后一個(gè)0就是要被擠掉的,可以從后向前進(jìn)行循環(huán)操作
核心代碼
for (int i = array.length - 1; i > index; i--) { array[i] = array[i-1]; } array[index] = insert;
全部代碼
package cn.ocean888; import java.util.Arrays; public class Demo3 { // 在指定位置插入指定元素 public static void main(String[] args) { // 先定義數組,最后一個(gè)0就是要被擠掉的 int[] array = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 0}; System.out.println(Arrays.toString(array)); // 要加入位置的索引 int index = 6; // 要加到這個(gè)數組里的數字 int insert = 12; boolean status = false; status = addElement(array, index, insert); printResult(status, array); } /** * 在數組指定位置添加元素,后面的依次往后移一位 * @param array 要添加元素的數組 * @param index 添加進(jìn)數組的位置索引 * @param insert 要添加進(jìn)入數組對應位置的值 * @return 返回是否添加成功 */ public static boolean addElement (int[] array, int index, int insert) { // 判斷插入位置是否存在于數組中 if (index < 0 || index >= array.length) { return false; } else { // 要插入元素位置開(kāi)始往后元素依次向后移一位 for (int i = array.length - 1; i > index; i--) { array[i] = array[i-1]; } array[index] = insert; return true; } } /** * 輸出更新后的數組 * @param status 添加元素是否成功的狀態(tài) * @param array 更新后的數組 */ public static void printResult(boolean status, int[] array) { if (status) { System.out.println(Arrays.toString(array)); } else { System.out.println("Input Parameter Error"); } } }
超出數組會(huì )溢出
和添加元素基本一致,邏輯變?yōu)閺膭h除位置開(kāi)始之后的元素都往前移一位,直接覆蓋掉要刪除位置元素
核心代碼
for (int i = index; i < array.length - 1; i++) { array[i] = array[i+1]; } // 最后一個(gè)元素補零 array[array.length - 1] = 0; return true;
0代表無(wú)效元素,占位使用
全部代碼
package cn.ocean888; import java.util.Arrays; public class Demo3 { // 刪除指定位置元素 public static void main(String[] args) { // 先定義數組 int[] array = { 1, 3, 5, 7, 9, 11, 11, 13, 15, 17}; System.out.println(Arrays.toString(array)); // 要刪除位置的索引 int index = 6; boolean status = false; status = delElement(array, index); printResult(status, array); } /** * 在數組指定位置刪除元素,后面的依次往前移一位 * @param array 要添加元素的數組 * @param index 添加進(jìn)數組的位置索引 * @return 返回是否添加成功 */ public static boolean delElement (int[] array, int index) { // 判斷刪除位置是否存在于數組中 if (index < 0 || index >= array.length) { return false; } else { // 要刪除元素位置開(kāi)始往后元素依次向前移一位 for (int i = index; i < array.length - 1; i++) { array[i] = array[i+1]; } // 最后一個(gè)元素補零 array[array.length - 1] = 0; return true; } } /** * 輸出更新后的數組 * @param status 添加元素是否成功的狀態(tài) * @param array 更新后的數組 */ public static void printResult(boolean status, int[] array) { if (status) { System.out.println(Arrays.toString(array)); } else { System.out.println("Input Parameter Error"); } } }
首先要明白一點(diǎn),形參是引用傳值,傳的是數組的首地址,操作的還是原來(lái)的數組
package cn.ocean888; import java.util.Arrays; public class Demo4 { public static void main(String[] args) { int[] array = { 4399, 3, 360, 3, 4, 11, 32, 3, 123, 86}; System.out.println(Arrays.toString(array)); arraySort(array); System.out.println(Arrays.toString(array)); } public static void arraySort(int[] array) { array[5] = 0; } }
for循環(huán)示意圖,也就是10個(gè)數兩兩比較,需要9次可以找出一個(gè)最大值,并且將最大值放到最后邊
i表示外部即第一層循環(huán)控制循環(huán)次數
j表示內部即第二層循環(huán)控制那些數兩兩間進(jìn)行比較
i=0 時(shí),j 要循環(huán)9次,找出最大值放到最后,下一次循環(huán)時(shí)最大值就不需要再管了
i=1 時(shí),因為已經(jīng)找到了最大值,所以這次 j 循環(huán)八次就可以了
i和j的對應關(guān)系: j = 數組長(cháng)度 -1 - i
為啥要減1:因為10個(gè)數兩兩比較,僅需要比較九次
源碼如下
package cn.ocean888; import java.util.Arrays; public class Demo4 { public static void main(String[] args) { // 冒泡排序算法,由小到大排序 int[] array = { 4399, 3, 360, 3, 4, 11, 32, 3, 123, 86}; // 打印數組 System.out.println(Arrays.toString(array)); // 進(jìn)行排序 arraySort(array); // 打印數組 System.out.println(Arrays.toString(array)); } /** * 冒泡排序 * @param array 要排序的數組 */ public static void arraySort(int[] array) { // 臨時(shí)變量 int temp = 0; // 第一層循環(huán)控制循環(huán)次數 for (int i = 0; i < array.length - 1; i++) { // 第二層循環(huán)控制那些數兩兩間進(jìn)行比較 for (int j = 0; j < array.length -1 - i; j++) { // 如果時(shí)從小到大排序if判斷就用< // 如果時(shí)從小到大排序if判斷就用> if (array[j+1] < array[j]) { // 兩個(gè)值間通過(guò)一個(gè)臨時(shí)變量進(jìn)行互換 temp = array[j+1]; array[j+1] = array[j]; array[j] = temp; } } } } }
排序效果
選擇排序基本想法是:比如有10個(gè)數,最大值在每次循環(huán)前初始化設置為數組第1個(gè)元素的值即array[0],然后與數組的其他剩余元素進(jìn)行比較,所以比較次數就是數組總元素-1,10個(gè)數循環(huán)9次就可以找到最大值,最大值和本次最后的項位置進(jìn)行互換
在i=1時(shí),因為已經(jīng)找到一個(gè)最大值并且放到最后了,所以j可以少循環(huán)依次
j = 數組的長(cháng)度-i-1
i = 1 時(shí)
package cn.ocean888; import java.util.Arrays; import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction; public class Demo5 { public static void main(String[] args) { // 選擇排序算法,由小到大排序 // 要排序的原數組 int[] array = { 4399, 3, 360, 3, 4, 11, 32, 3, 123, 86}; // 打印數組 System.out.println(Arrays.toString(array)); // 進(jìn)行排序 arraySort(array); // 打印數組 System.out.println(Arrays.toString(array)); } /** * 選擇排序算法,由小到大排序 * @param array 要排序的數組,引用賦值直接操作數組不需要返回值 */ public static void arraySort(int[] array) { for (int i = 0; i < array.length; i++) { int max = 0; int temp = 0; // 找出最大值索引,賦值給max for (int j = 0; j < array.length - i; j++) { if (array[j] > array[max]) { max = j; } } // 將最大值和本次最后的項進(jìn)行互換 temp = array[array.length - 1 -i]; array[array.length - 1 -i] = array[max]; array[max] = temp; } } }
效果展示
選擇排序相較于冒泡排序來(lái)說(shuō)要快一些,選擇排序的時(shí)間復雜度為n(n-1)/2,而冒泡排序為O(n^2),一般建議選擇排序,當然還有其他更好的排序方法。
到此這篇關(guān)于java數組算法例題代碼詳解(冒泡排序,選擇排序,找最大值、最小值,添加、刪除元素等)的文章就介紹到這了,更多相關(guān)java數組算法內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站