归并排序
来源:互联网 发布:excel函数不重复数据 编辑:程序博客网 时间:2024/05/19 23:12
一个归并排序的例子:对一个随机点的链表进行排序
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。算法时间复杂度位O(nlogn).
归并操作:
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
算法描述:
1.设定两个指针,最初位置分别为两个已经排序序列的起始位置
2.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
3.重复步骤3直到某一指针达到序列尾
4.将另一序列剩下的所有元素直接复制到合并序列尾
归并排序:
归并排序具体工作原理如下(假设序列共有n个元素):
1.将序列每相邻两个数字进行归并操作,形成floor(n / 2)个序列,排序后每个序列包含两个元素
2.将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素
3.重复步骤2,直到所有元素排序完毕
代码如下:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<climits>#include<cstdlib>using namespace std;void merge(int *a, int low, int mid, int high) //归并操作{int k, begin1, begin2, end1, end2;begin1 = low;end1 = mid;begin2 = mid + 1;end2 = high;int *t = (int *) malloc((high - low + 1) * sizeof(int));for(k = 0; begin1 <= end1 && begin2 <= end2; ++k) //自小到大排序{if(a[begin1] <= a[begin2])t[k] = a[begin1++];elset[k] = a[begin2++];}if(begin1 <= end1) //左剩memcpy(t + k, a + begin1, (end1 - begin1 + 1) * sizeof(int));else //右剩memcpy(t + k, a + begin2, (end2 - begin2 + 1) * sizeof(int));memcpy(a + low, t, (high - low + 1) * sizeof(int)); //排序后复制到原数组free(t); //释放空间}void merge_sort(int *a, unsigned int begin, unsigned int end){int mid;if(begin < end){mid = (end + begin) / 2;merge_sort(a, begin, mid);merge_sort(a, mid + 1, end);merge(a, begin, mid, end);}}int main(){int a[10];for(int i = 0; i < 10; ++i)cin>>a[i];merge_sort(a, 0, 9);for(int i = 0; i < 10; ++i)cout<<a[i]<<" ";cout<<endl;}
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- ORA-01186/ORA-01122/ORA-01110/ORA-01206
- Android JNI学习之javah命令的正确使用 转
- Apad Qzone项目总结(一)---发布!!!
- Prefuse及相关数据结构可视化工具
- 云计算之分布式文件系统
- 归并排序
- 使用maven常见的误区与解决办法!
- Android:关于Configurations
- 数据库名、实例名和ORACLE_SID的区别
- 字符串中替换宏
- EL表达式
- FLash 学习
- socket udp
- jvm学习笔记(1)class文件