分治算法
来源:互联网 发布:客多宝宠物店软件下载 编辑:程序博客网 时间: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
- 分治算法
- 分治算法
- 分治算法?
- 【算法】分治
- 【算法】分治
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- nexus3.3.1上传第三方jar包
- js省市县封装
- 搭建Windows Embedded Compact 7开发环境
- Android工程源码版本信息
- 算法学习(一):DBSCAN聚类算法
- 分治算法
- 一个简单的类似通讯录的封装代码
- Android4.x 如何处理Power按键
- 深入理解Activity启动流程
- nginx负载均衡单点解决方案
- c#学习摘录:类\继承\接口\字段、方法、属性\浅深复制(1)
- 面向对象设计的一个有缺陷的缓存机制
- CentOS无法联网
- Thinkphp3.2图片上传服务器端接收