分治算法

来源:互联网 发布:客多宝宠物店软件下载 编辑:程序博客网 时间:2024/06/05 20:50

一,分治算法的思想

将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归求解这些子问题,然后将各子问题的解合并得到原问题的解。


二,常见的使用分治算法求解的问题

1,二分搜索技术

int BinarySearch(vector<int> &nums, int x){    int low = 0, mid, high = nums.size() - 1;    while(low <= high){        mid = (low + high) / 2;        if(nums[mid] == x){            return mid;        } else if(nums[mid] > x){            high = mid - 1;        } else {            low = mid + 1;        }    }    return -1;}


2,快速排序

void quickSort(vector<int> &nums, int s, int t){    if(s < t){        int temp = nums[s];        int i = s, j = t;        while(i < j){            while(i < j && nums[j] >= temp){                j --;            }            nums[i] = nums[j];            while(i < j && nums[i] <= temp){                i ++;            }            nums[j] = nums[i];        }        nums[i] = temp;        quickSort1(nums, s, i - 1);        quickSort1(nums, i + 1, t);    }}


3,归并排序

void Merge(int nums[], int low, int mid, int high){    int i = low, j = mid + 1, k = 0;    int *temp;    temp = new int[high - low + 1];    while(i <= mid && j <= high){        if(nums[i] < nums[j]){            temp[k ++] = nums[i];            i ++;        } else {            temp[k ++] = nums[j];            j ++;        }    }    while(i <= mid){        temp[k ++] = nums[i];        i ++;    }    while(j <= high){        temp[k ++] = nums[j];        j ++;    }    for(i = low, k = 0; i <= high; k ++, i ++){        nums[i] = temp[k];    }    delete temp;}void MergePass(int nums[], int length, int n){    int i;    for(i = 0; i + 2 * length - 1 < n; i = i + 2 * length){        Merge(nums, i, i + length - 1, i + 2 *length - 1);    }    if(i + length - 1 < n - 1){        Merge(nums, i, i + length - 1, n - 1);    }}void MergeSort(int nums[], int numsSize){    for(int length = 1; length < numsSize; length = 2 * length){        MergePass(nums, length, numsSize);    }}

0 0