归并排序、二分法查找的递归实现
2014-02-22 14:42
369 查看
一、归并排序
1、分解:将序列分解成两个子序列;
2、解决:在MergeSort中首先将A[p..(p+q)/2]排序排好,再将A[(p+q)/2..q]排序;
3、合并:将两个已经排序好的子序列合并
要注意基准条件 if (p >= q) return;
二、二分法查找的递归实现
1、分解:二分为两个子序列
2、解决:根据中间数组的大小判断是在哪个子序列中查找
3、合并:根据基准条件返回返回值
// 归并排序 // 2014-2-22 #include <iostream> using namespace std; void Merge(int* array, int p, int q, int r); void MergeSort(int* array, int p, int q); int main() { int array[10]; for (int i = 0; i < 10; ++ i) cin >> array[i]; MergeSort(array, 0, 9); for (i = 0; i < 10; ++ i) cout << array[i] << " "; cout << endl; return 0; } void Merge(int* array, int p, int q, int r) { int * tmp = new int[r - p + 1]; // if (p == r) // return ; int pflg = p; int qflg = q + 1; for (int i = 0; i < r - p + 1; ++ i) { if (pflg == q + 1) { //array[q] = 100000; //哨兵牌 无穷大 //pflg = q; for (int j = i; j < r - p + 1; ++ j) //不用哨兵牌 tmp[j] = array[qflg ++]; //不用哨兵牌 break; //不用哨兵牌 } else if (qflg == r + 1) { //array[r] = 100000; //哨兵牌 无穷大 //qflg = r; for (int j = i; j < r - p + 1; ++ j) //不用哨兵牌 tmp[j] = array[pflg ++]; //不用哨兵牌 break; //不用哨兵牌 } if (array[pflg] < array[qflg]) tmp[i] = array[pflg ++]; else tmp[i] = array[qflg ++]; } for (i = p; i <= r; ++ i) array[i] = tmp[i - p]; delete [] tmp; } void MergeSort(int* array, int p, int q) { if (p < q) { MergeSort(array, p, (p + q) / 2); MergeSort(array, (p + q) / 2 + 1, q); Merge(array, p, (p + q) / 2, q); } }
1、分解:将序列分解成两个子序列;
2、解决:在MergeSort中首先将A[p..(p+q)/2]排序排好,再将A[(p+q)/2..q]排序;
3、合并:将两个已经排序好的子序列合并
要注意基准条件 if (p >= q) return;
二、二分法查找的递归实现
//二分法查找递归实现 //note: 数组必须是已经排序的 //2014-2-22 #include <iostream> using namespace std; int Find(int* array, int a, int b, int x); int main() { int array[10]; cout << "please input an array in ascending order:" << endl; for (int i = 0; i < 10; ++ i) cin >> array[i]; cout << "please input the number that you want to find in this array:" << " "; int x; cin >> x; cout << Find(array, 0, 9, x) << endl; return 0; } int Find(int* array, int a, int b, int x) { if (a < b) return -1; if (a == b) if (array[a] == x) return a + 1; else return -1; else if (array[(a + b) / 2] == x) return (a + b) / 2 + 1; else if (array[(a + b) / 2] > x) return Find(array, a, (a + b) / 2, x); else return Find(array, (a + b) / 2 + 1, b, x); }
1、分解:二分为两个子序列
2、解决:根据中间数组的大小判断是在哪个子序列中查找
3、合并:根据基准条件返回返回值
相关文章推荐
- 用PHP实现二分法查找之递归和迭代
- 二分法查找实现(递归与非递归)
- 二分法查找的实现 递归与非递归方法
- 递归实现二分法查找----python
- 求n的阶乘(递归&&非递归),Fibonacci函数,二分法查找,汉诺塔实现,排列组合,整数划分,一元多项式的加减乘
- 用PHP实现二分法查找之递归和迭代
- java 用二分法(递归)实现查找指定元素
- c语言简单递归/非递归实现二分查找
- 折半查找和递归折半查找详解(二分法查找,递归二分法查找)
- 二叉查找树带父节点指针的创建,销毁,查找,删除,插入,找前驱后继,找最小值最大值(递归和非递归的实现)
- 数据结构10:二分查找的递归与非递归表示与实现
- c语言利用递归实现二分查找
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 归并排序的递归和非递归实现(C代码)
- 递归实现单链表的查找
- Java实现折半查找(二分查找)的递归和非递归算法
- 二分法查找[折半查找][Java实现]
- 数据结构之二分法查找、快速排序思想与实现
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二分法查找的C++实现