算法初探——归并排序
2016-04-09 21:12
441 查看
借用大话数据结构的一个例子
如何得到全省的高考排名,其实就是每个市,每个县、每个学校、每个班级的排名合并后再排名得到的。
要比较两个学生的成绩是很容易的,比如甲比乙的分数低,丙比丁的分数低。那么我们也就可以合并得到甲乙丙丁的成绩排名。。。。以此类推,我们就可以得到全省的成绩排名了。
原理:假设初始记录序列含有n个记录,则可以看出是n个序列的子序列,每个子序列的长度为1,然后两两归并,得到【n/2】(向上取整)个长度为2或者1的子序列,再通过两两归并………直到得到一个长度为n的子序列。
过程如下图所示:
归并算法是建立在递归操作上的一种排序算法,是分治思想的典型应用。
很明显看出时间和空间复杂度。
如何得到全省的高考排名,其实就是每个市,每个县、每个学校、每个班级的排名合并后再排名得到的。
要比较两个学生的成绩是很容易的,比如甲比乙的分数低,丙比丁的分数低。那么我们也就可以合并得到甲乙丙丁的成绩排名。。。。以此类推,我们就可以得到全省的成绩排名了。
原理:假设初始记录序列含有n个记录,则可以看出是n个序列的子序列,每个子序列的长度为1,然后两两归并,得到【n/2】(向上取整)个长度为2或者1的子序列,再通过两两归并………直到得到一个长度为n的子序列。
过程如下图所示:
归并算法是建立在递归操作上的一种排序算法,是分治思想的典型应用。
#include "iostream" #include <vector> #include <algorithm> using namespace std; void comVector(vector<int> & arr, int start, int mid, int end); void mergesort(vector<int> & arr, int start, int end); void Show(int x); int main() { vector<int> temp = { 12, 15, 18, 3, 9, 21 }; vector<int> a1 = { 2, 4, 6, 8, 1, 3, 5, 9 }; mergesort(a1, 0, a1.size() - 1); for_each(a1.begin(), a1.end(), Show); cout << endl; cin.get(); return 0; } void mergesort(vector<int> & arr, int start, int end) { if (start<end) { int mid = (start + end) / 2; mergesort(arr, start, mid); //左半部分有序 mergesort(arr, mid + 1, end); //右半部分有序 comVector(arr, start, mid, end); } } void comVector(vector<int> & arr,int start ,int mid,int end) { vector<int> res; int i = start, j = mid + 1; int m = mid, n = end; int k = 0; while (i <= m &&j <= n) { if (arr[i] < arr[j]) { res.push_back(arr[i]); i++; } else { res.push_back(arr[j]); j++; } } while (i<=m) { res.push_back(arr[i]); i++; } while (j <= n) { res.push_back(arr[j]); j++; } for (int i = start; i <= end; i++) { arr[i] = res[k++]; } } void Show(int x) { cout << x << " "; }
很明显看出时间和空间复杂度。
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析