分治算法

分治算法就是把一个大的问题递归转化为许多原理相同的小问题,通过解决这些小问题,进而以合并以达到解决大问题的目的

问题: 对于任意一个已知数组,如何利用分治的方法把数组从大到小排序?
#include <stdio.h>

int L[100],R[100];
void merge(int numbers[],int left,int mid, int right)
{
    int n1 = mid - left + 1;
    int n2 = right - mid;
    int i,j,k;
    for(i = 1;i<=n1;i++)
        L[i] = numbers[left+i-1]; // 临时数组,用于储存numbers传入数组的值
    for(j = 1;j<=n2;j++)
        R[j] = numbers[mid+j];
    L[n1+1] = 99999;  //确立边界(个人不喜欢这样)便于下一步的大小比较
    R[n2+1] = 99999;

    i = 1;
    j = 1;

    for(k = left;k<=right;k++)
        if(L[i]<=R[j])          //确立大小关系,重构numbers
        {
            numbers[k] = L[i];
            i++;
        }
        else
        {
            numbers[k] = R[j];
            j++;

        }

}

void mergeSort(int numbers[],int left,int right)

{
    if(left < right)
    {
        int mid; //int的智慧
        mid  = (right + left) / 2;
        mergeSort(numbers,left,mid);
        mergeSort(numbers,mid+1,right);
        merge(numbers,left,mid,right);
    }
}


int main()
{
    int numbers[]={5,2,4,6,1,3,2,6}; //此处的numbers可以任意替换
    mergeSort(numbers , 0, 7);
    for(int i = 0;i<8;i++)
    {
        printf("%d",numbers[i]);
    }
}

对于较为简单的排序问题,冒泡就可以很容易的解决,但冒泡的时间复杂度是O(n^2),而分治的时间复杂度是O(n*log n),虽然编写难度较大,但是计算机运行更加容易

汉诺塔,输入两个整数,N,M,N表示要移动的盘子数目,M表示最少移动的第M步。蓝桥T1512
#include <bits/stdc++.h>
using namespace std;
int sum = 0,m;
void hanoi(char x,char y,char z,int n){
	if(n == 1) {
		sum++;
		if(sum == m) cout << "#" << n << ":" << x << "->" << z << endl;
	}
	else{
		hanoi(x,z,y,n-1);
		sum++;
		if(sum == m) cout << "#" << n << ":" << x << "->" << z <<endl;
		hanoi(y,x,z,n-1);
	}
}
int main()
{
	int n;
	cin>>n>>m;
	hanoi('A','B','C',n);
	cout << sum <<endl;
	return 0;
}
posted @ 2024-01-04 15:14  高性能萝卜子  阅读(31)  评论(0)    收藏  举报