归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(将问题分成一些小的问题,然后递归求解,而治的阶段则将分成的阶段得到的个答案“修补”在一起,即分而治之)
先分后合,要学会联想jvm的工作原理,一条分支结束后一步一步出栈,进入下一分支,也就是递归回溯。
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] arr ={8,4,5,7,1,3,6,2};
int[] temp =new int[arr.length];
mergeSort(arr, 0, arr.length-1, temp);
System.out.println(Arrays.toString(arr));
}
private static void mergeSort(int[] arr,int left,int right,int[] temp){
if (left<right){
int mid =(left+right)/2;
//分
mergeSort(arr, left, mid,temp);
mergeSort(arr, mid+1, right, temp);
//治
merge(arr, left, mid, right, temp);
System.out.println(left+" "+right);
}
}
/**合并
*
* @param arr 原始数组
* @param left 左边有序序列的初始索引
* @param mid 中间索引
* @param right 右边有序序列的初始索引
* @param temp 中转数组
*/
private static void merge(int[] arr,int left,int mid,int right,int[] temp){
int i =left;
int j =mid+1;
int t =0; //temp 的当前索引
while (i<=mid&&j<=right){
if (arr[i]<=arr[j]){
temp[t]=arr[i];
i++;
t++;
}else {
temp[t]=arr[j];
j++;
t++;
}
}
//如果一方完了之后
while (i<=mid){
temp[t]=arr[i];
t++;
i++;
}
while (j<=right){
temp[t]=arr[j];
t++;
j++;
}
//三、将temp数组的阿匀速拷贝到arr;
//并不是每次都拷贝所有
t=0;
int templeft=left;
while (templeft<=right){
arr[templeft]= temp[t];
templeft+=1;
t+=1;
}
}
}
分治实战:
图解:
class Solution {
public String longestCommonPrefix(String[] strs) {
String str="";
if(strs.length==0||strs==null){
return "";
}else{
str= mergefind(0,strs.length-1,strs);
}
return str;
}
public String mergefind(int start,int last,String[] strs){
if(start==last){
return strs[start];
}else{
int mid =(start+last)/2;
String leftstr= mergefind(start,mid,strs);
String rightstr= mergefind(mid+1,last,strs);
return merge(leftstr,rightstr);
}
}
public String merge(String leftstr,String rightstr){
if (leftstr.equals("")||rightstr.equals("")){
return "";
}
int i =0;
boolean flag =false;
while(leftstr.charAt(i)==rightstr.charAt(i)){
flag=true;
i++;
if (i>leftstr.length()-1||i>rightstr.length()-1) {
break;
}
}
if (flag){
return leftstr.substring(0, i);
}else {
return "";
}
}
}