使用特征
- 可以将一个问题划分为n个(缩小规模)。
- 各个子问题相互独立
- 子问题的解经过简单合并为问题的解

归并排序
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 ;
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++;
}
}
}
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++
}
}