package day01; public class Suan02DBExist { /** * 问题:查找数组中是否有num这个数,有返回false。及数的位置 * 思路:笨方法就是便利数组,查找是否有相等的 * 快一点的方法:二分法,将数组对半劈开,具体如下,此题的前提必须是有序数组 * */ public static final int LAST = -1; //前提必须保证是有序数组 public static boolean isExist(int[] arr,int num){ //定义头 int head = 0; //定义尾部 int tail = arr.length-1; //定义中间 int mid = 0; while(head<=tail){ //mid = (head+tail)/2; //容易溢出,所以最好写成 mid = head/2+tail/2; //或者写成,>>无符号右移一位等同于除以2 mid = head + ((tail-head)>>1); if(arr[mid]==num){ return true; }else if(arr[mid]>num){ tail = mid-1; }else if(arr[mid]<num){ head = mid+1; } } return false; } public static void SelectSort(int[] arr){ /*选择排序思路: *1.先定最小值min,假设i位最小 *2.遍历第一遍,遇到比min位小的就将那位(j)赋值给min *3.交换min和i所在的数值 *注意:此方法i不用便利到最后一位,因为就是将最小的全都挪到最前面,剩最后一位那肯定就是最大的了 */ for (int i = 0; i < arr.length-1; i++) { int min = i; for(int j = i+1;j<arr.length;j++){ if(arr[min]>arr[j]){ min = j; } } swap(arr,i,min); } } public static void swap(int[] arr,int one,int two){ if(one!=two) { arr[one] = arr[one] ^ arr[two]; arr[two] = arr[one] ^ arr[two]; arr[one] = arr[one] ^ arr[two]; } } public static int[] RandomTest(int sizeMax,int valueMax){ int[] arr = new int[(int)(Math.random()*(sizeMax+1))+4]; for (int i = 0; i < arr.length; i++) { arr[i] = (int)(Math.random()*(valueMax+1))-(int)(Math.random()*(valueMax)); } return arr; } public static void main(String[] args) { int sizeMax = 10; int valueMax = 100; int[] arr = RandomTest(sizeMax,valueMax); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+" "); } SelectSort(arr); if(isExist(arr,arr[3])) { System.out.println("数组中有:"+arr[3]); }else{ System.out.println("数组没有:"+arr[3]); } } }
二分法查找数组元素是否存在
最新推荐文章于 2022-03-07 21:03:09 发布