3 import java.util.Arrays; 6 public class ArrayExer4 { 7 /* 8 記住: 9 十大內部排序算法以下: 10 11 選擇排序(2種 說明:堆排序要理解排序方法實現思路) 12 直接選擇排序、堆排序 13 交換排序(2種 說明:這兩種須要會手寫) 14 冒泡排序、快速排序 15 插入排序(3種) 16 直接插入排序、折半插入排序、Shell排序(也叫希爾排序) 17 歸併排序(1種 說明:要理解排序方法實現思路) 18 ********* 以上8種是經常使用的排序 ************ 19 桶式排序 20 基數排序 21 ********* 最後這2種是不經常使用的排序 ************ 22 23 理解: 24 1)衡量排序算法的優劣 25 時間複雜度、空間複雜度、穩定性 26 27 2)排序的分類:內部排序(內存中) 與 外部排序(須要藉助於磁盤) 28 29 3)不一樣排序算法的時間複雜度 30 冒泡時間複雜度:O(n^2) n的平方 31 快排時間複雜度:O(nlog(n)) 32 堆排序、歸併排序 33 */ 34 35 public static void main(String[] args) { 36 int[] arr = new int[]{34,5,22,-98,6,-76,0,-3}; 37 /* 38 使用冒泡排序,實現數組的從小到大排序 39 */ 40 41 //長度爲8的數組,比較7輪 42 for (int i = 0; i < arr.length-1; i++) { 43 //每一輪都是從第一個元素與第二個元素比較,較大者放到右邊,依次比較,直到一輪結束時,最後一個元素是最大值,下一輪不參與比較 44 for (int j = 0; j < arr.length-i-1; j++) { 45 int tmp = 0; 46 if(arr[j]>arr[j+1]){ 47 tmp = arr[j]; 48 arr[j] = arr[j+1]; 49 arr[j + 1] = tmp; 50 } 51 } 52 //查看每一輪比較後的數組狀況 53 System.out.println(Arrays.toString(arr)); 54 } 55 56 System.out.println("******************"); 57 /* 58 反轉上面的數組 59 */ 60 61 for (int i = 0,j = arr.length -1; i < j; i++,j--) { 62 int tmp; 63 tmp = arr[i]; 64 arr[i] = arr[j]; 65 arr[j] = tmp; 66 } 67 System.out.println("反轉後的數組" + Arrays.toString(arr)); 68 69 70 System.out.println("******************"); 71 /* 72 複製上面的數組 73 */ 74 int[] arr2 = new int[arr.length]; 75 for (int i = 0; i < arr.length; i++) { 76 arr2[i] = arr[i]; 77 } 78 System.out.println("複製後的數組:" + Arrays.toString(arr2)); 79 80 81 System.out.println("******************"); 82 /* 83 線性查找:經過遍歷方式,一個一個的數據進行比較、查找 84 適用性:具備廣泛適用性。 85 二分法查找:每次比較中間值與目標值的大小,折半的方式檢索 86 適用性:(前提:數組必須有序) 87 使用線性查找,從上面的數組中查找22是否存在,若是存在,返回所在位置索引,不存在,輸出提示信息 88 */ 89 // //查找目前元素值 90 // int dest = 2; 91 // //判斷標誌:若是找到了,則爲false,若是沒有找到,則不變一直依然爲true 92 // boolean flag = true; 93 // for (int i = 0; i < arr2.length; i++) { 94 // if(arr2[i] ==dest){ 95 // System.out.println("數組中存在值爲" + dest + "的元素,其索引是:" + i); 96 // //元素找到,判斷標誌設爲false 97 // flag = false; 98 // break; 99 // } 100 // } 101 // //flag 一直不變爲true,這說明程序從沒進入上面的if語句,也就是沒有找到目前元素 102 // if (flag) { 103 // System.out.println("抱歉,數組中沒有值爲" + dest + "的元素!"); 104 // } 105 106 107 //第二種方式(拓寬思路:就是說i表明索引值不斷遞增, 108 // 遍歷完全部的元素都沒有查找到目標元素值的話, 109 // 那麼最後i遞增到循環條件不知足時,提示沒有找到就能夠了) 110 int dest = 2; 111 int i = 0; 112 for (i = 0; i < arr2.length; i++) { 113 if(arr2[i] == dest){ 114 System.out.println("數組中存在值爲" + dest + "的元素,其索引是:" + i); 115 break; 116 } 117 } 118 //若是目標元素找到了,那麼i確定是i<arr2.length. 119 // 若是沒有找到,i必然會遞增到i == arr2.length的時候 120 if(i == arr2.length){ 121 System.out.println("抱歉,數組中沒有值爲" + dest + "的元素!"); 122 } 123 124 System.out.println("******************"); 125 /* 126 數組中常見的異常有哪些?舉例說明 127 */ 128 129 //ArrayIndexOutOfBoundsException:數組索引越界異常 130 //合理範圍:[0,arr.length-1] 131 //越界:arr[-1],arr[arr.lenth] 132 133 //NullPointerException:空指針異常 134 //int[] arr = null; 135 //arr[0]; 空指針異常 136 } 137 }