一,分治算法的思想
将一个规模为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);
}
}
2万+

被折叠的 条评论
为什么被折叠?



