数组常见操作
-
遍历
/** * @ClassName: ArrayDemo4 * @Description: TODO * @Author: benjamin * @Date: 2019/3/23 11:27 * @Version: 1.0 */ public class ArrayDemo4 { public static void main(String[] args) { int[] arr = {1,2,3,4,5,6,7}; System.out.println("length:"+arr.length); //打印数组的长度 for(int i = 0;i<arr.length;i++){ //数组的遍历输出-》顺序 System.out.println("arr["+i+"] = "+arr[i]+";");//arr[0]=1,....; } System.out.println(" "); for(int i = arr.length-1;i>=0;i--){ //数组倒序的遍历输出 System.out.println("arr["+i+"] = "+arr[i]+";");//arr[0]=1,....; } System.out.println(" "); for(int i =0;i<arr.length;i+=2){ //自定义步长输出 System.out.println("arr["+i+"] = "+arr[i]+";");//arr[0]=1,....; } // System.out.println("Hello World"); } }
-
最值
两个思路:一是比较最大的值;二是找到最大的下标,然后返回最大的值。
/** * @ClassName: ArrayDemo5 * @Description: TODO * @Author: benjamin * @Date: 2019/3/23 11:39 * @Version: 1.0 */ public class ArrayDemo5 { public static void main(String[] args) { // int[] array = new int[]{-1,-9,-8,-2}; int[] array = new int[]{22,3,1,343,455,24,5}; System.out.println("max = "+getMaxNum(array)); System.out.println("max = "+getMaxNum_2(array)); } /* 获取数组中的最大值; * 思路: * 1. 需要进行比较,并定义变量记录每次比较后较大的值; * 2. 对数组中的元素进行遍历取出,和变量中记录的元素进行比较; * 如果遍历到的元素大于变量中记录的元素,就用变量记录住该大的值; * 3. 遍历结果,该变量记录就是最大的值; * */ public static int getMaxNum(int[] array){ // int maxValue = array[0]; for(int i = 1; i<array.length;i++){ if(array[i]>=maxValue) maxValue = array[i]; } return maxValue; } public static int getMaxNum_2(int[] array){ //找到最大的下标,返回最大的值array[maxIndex] int maxIndex = 0; for(int i = 1; i<array.length;i++){ if(array[i]>=array[maxIndex]) maxIndex = i; } return array[maxIndex]; } }
-
排序
-
选择排序
/** * @ClassName: SelectSort * @Description: 选择排序 * @Author: benjamin * @Date: 2019/3/24 15:23 * @Version: 1.0 */ public class SelectSort { public static void main(String[] args) { //定义一个数组 元素类型[] 数组名 = new 元素类型 [] {元素1,元素2...} int [] array = new int[]{54,26,93,17,77,313,44,55,20}; selectSort(array);//选择排序 //打印数组; for(int i =0;i<array.length;i++){ System.out.print(array[i]+","); } // System.out.println("Hello World"); } public static void selectSort(int[] array){ // 选择排序算法 // 最外层的循环用来遍历数组,最后一个元素不用比 for(int i=0;i<array.length-1;i++){ //最外层用来i从0到数组的长度减1,最后一个数不用排; for(int j=i+1;j<array.length;j++){ // j从比i大1的位置开始比较,一直比到最后一个值(此时对应的值是数组中最后一个值);找最小的值; if(array[i]>array[j]){ // int temp = array[i]; // array[i] = array[j]; // array[j] = temp; swap(array,i,j); } } } } //交换函数; public static void swap(int[] array,int a,int b){ int temp = array[a]; array[a] = array[b]; array[b] = temp; } }
-
冒泡排序
/** * @ClassName: BubbleSort * @Description: 冒泡排序 * @Author: benjamin * @Date: 2019/3/24 17:06 * @Version: 1.0 */ public class BubbleSort { public static void main(String[] args) { int[] array = new int[]{54,26,93,17,77,313,44,55,20}; bubbleSort(array); //打印数组; for(int i =0;i<array.length;i++){ System.out.print(array[i]+","); } } public static void bubbleSort(int[] array){ //冒泡排序 for(int i=0;i<array.length-1;i++){ //走的次数;大循环保证取值从0到数组的最后一个元素array[length-1] for(int j=0;j<array.length-1-i;j++){ // -1 是为了避免越界,比如array[8]与array[8+1]比。后者越界不存在; // -i 让外循环每增加一次,内循环参与比较的元素个数递减 // i = 0 ,比较9次;i=1,比较8次; if(array[j] > array[j+1]){ // int temp = array[j]; // array[j] = array[j+1]; // array[j+1] = temp; swap(array,j,j+1); } } } } //交换函数; public static void swap(int[] array,int a,int b){ int temp = array[a]; array[a] = array[b]; array[b] = temp; } }
-
-
折半查找(二分查找)
/** * @ClassName: ArrayDemo7 * @Description: 数组常见功能查找 * @Author: benjamin * @Date: 2019/3/24 20:55 * @Version: 1.0 */ public class ArrayDemo7 { public static void main(String[] args) { int[] array = new int[]{12,23,34,55,56}; int key = getIndex(array,23); System.out.println("key:"+key); int value = binarySearch(array,55); int value2 = binarySearch_2(array,56); System.out.println("value:"+value); System.out.println("value2:"+value2); } //数组常见的功能:通过key查找数组中对应的元素 public static int getIndex(int[] array,int key){ for(int i =0;i<array.length;i++){ if(array[i] == key){ return i; //返回这个下标 } } return -1; //表示没有这个下标的元素 } //二分查找:binarySearch,返回输入元素的下标; public static int binarySearch(int[] array,int value){ int low = 0; int high = array.length-1; int mid = (low + high) / 2; while(array[mid] != value){ if(value > array[mid]){ //如果所给值大于中间数,则保留mid右边 low = mid + 1; }else if(value < array[mid]){ //如果所给值小于中间数,则保留mid左边 high = mid - 1; } if (high < low){ // 代表循环结束 return -1; } mid = (high+low)/2; } return mid; } public static int binarySearch_2(int[] array,int value){ int low = 0; int high = array.length-1; while(low <= high){ //只要low int mid = (low + high) / 2; if(value > array[mid]){ low = mid + 1; }else if(value < array[mid]){ high = mid - 1; }else{ return mid; } } return -1; } }
面试题:给定一个有序的数组,若果往该数组中存储一个元素,并保证这个数组还是有序的,那么这个元素的存储的角标如何获取?
数组,有序,优先想到二分查找
/** * @ClassName: ArrayDemo8 * @Description: * 给定一个有序的数组, * 如果往该数组中存储一个元素,并保证这个数组还是有序的, * 那么这个元素的存储的角标如何获取? * @Author: benjamin * @Date: 2019/3/24 21:45 * @Version: 1.0 */ public class ArrayDemo8 { public static void main(String[] args) { int[] array = new int[]{12,23,34,55,56}; int index = binarySearch(array,40); System.out.println("该放在"+index+"的位置"); } public static int binarySearch(int[] array,int value){ int low = 0; int high = array.length-1; while(low <= high){ int mid = (low + high) / 2; if(value > array[mid]){ low = mid + 1; }else if(value < array[mid]){ high = mid - 1; }else{ return mid; } } return low;//此时low是大于high的值,也就是放入的这个数在low的位置; } }