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 }