数组相关总练习

  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 }
原文地址:https://www.cnblogs.com/zui-ai-java/p/14220668.html