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 }