分治算法

55 阅读1分钟

使用特征

  1. 可以将一个问题划分为n个(缩小规模)。
  2. 各个子问题相互独立
  3. 子问题的解经过简单合并为问题的解

image.png

归并排序

  • java
public class MergeSort{
    //分
    public 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);
        }
    }
    //合
    public 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];
                t++;
                i++;
            }else{
                temp[t] = arr[j];
                t++;
                j++;
            }
        }
        
        //判断是否有余数
        //左边
        while(i <= mid){
            temp[t] = arr[i];
            i++;
            t++;
        }
        //右边
        while(j <= right){
            temp[t] = arr[j];
            j++;
            t++;
        }
        
        //拷贝到原数组
        while (left <= right){
            arr[left] = temp[t];
            t++;
            left++;
        }
        
    }
}
  • go
func main() {
   arr := []int{8,5,6,9,7,4,2}
   temp := make([]int,len(arr))
   MergeSort(arr,0,len(arr)-1,temp)
   fmt.Println(arr)
}

func MergeSort(arr []int, left int, right int, temp []int) {
   if left < right {
      mid := (left + right) / 2
      MergeSort(arr, left, mid, temp)
      MergeSort(arr, mid+1, right, temp)
      Merge(arr,left,mid,right,temp)
   }
}

func Merge(arr []int, left int, mid int, right int, temp []int) {
   i := left
   j := mid + 1
   t := 0
   for i <= mid && j <= right{
      if arr[i] < arr[j] {
         temp[t] = arr[i]
         i++
         t++
      }else {
         temp[t] = arr[j]
         j++
         t++
      }
   }

   for i <= mid {
      temp[t] = arr[i]
      i++
      t++
   }
   for j <= right {
      temp[t] =arr[j]
      j++
      t++
   }

   t = 0
   for left <= right {
      arr[left] = temp[t]
      t++
      left++
   }
}