2020.06.03
1、二分查找
狭义上的二分查找只适合有序数组,但是二分的思想却是可以用到无序但是有一定特点的数组,比如旋转数组、1~n内找出缺失的数等。
public class BinarySearch {
public static void main(String[] args) {
int[]arr={
1,1,1,1,2};
System.out.println(process(arr,2));
}
/**
* 找到下标---二分查找需要保证有序
* @param arr
* @param target
* @return
*/
public static int process(int[] arr,int target){
int low=0,mid=0,high=arr.length-1;
while (low<=high){
mid=low+(high-low)/2;
if (arr[mid]>target){
high=mid-1;
}else if (arr[mid]==target){
return mid;
}else {
low=mid+1;
}
}
return -1;
}
}
2、归并merge
归并排序的merge函数的思想可以用来求数组中前后元素的关系,通过不断分割,可以把数组分成一个一个元素,相当于就是只有前后两个元素了。比如小和问题、逆序对问题都是可以使用归并排序来解决。
public class MergeSort {
public static void main(String[] args) {
int []arr=new int[10];
for (int i=0;i<10;i++){
arr[i]=new Random().nextInt(10);
}
System.out.println(Arrays.toString(arr));
sort(arr);
System.out.println(Arrays.toString(arr));
}
/**
* 排序
* @param arr
*/
public static void sort(int[] arr){
if (arr==null||arr.length==0){
return;
}
mergesort(arr,0,arr.length-1);
}
/**
* 归并
* @param arr
* @param left
* @param right
*/
private static void mergesort(int[] arr, int left, int right) {
if (left>=right){
return;
}
//使用位运算,一定需要注意优先级,最好加上括号
int mid=left+((right-left)>>1);
//递归--快排没有mid,但是有partition,而且快排的左边是0~partition-1
mergesort(arr,left,mid);
mergesort(arr,mid+1,right);