排序——归并排序
来源:互联网 发布:虚拟主机linux 编辑:程序博客网 时间:2024/05/11 13:25
归并排序
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。
如设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
算法分析
平均时间复杂度:O(nlog2n)
空间复杂度:O(n) (用于存储有序子序列合并后有序序列)
算法实现
<span style="font-size:14px;">#include <stdio.h>#include <stdlib.h>//用于实现两个有序的序列合并为一个有序的序列int Merger(int a[],int low,int high,int tmp[]){ int mid=(low+high)/2,i=0,m=mid+1; while(low<=mid&&m<high) { if(a[low]<a[m]) { tmp[i]=a[low]; low++; } else{ tmp[i]=a[m]; m++; } i++; } while(low<=mid) { tmp[i++]=a[low++]; } while(m<=high) { tmp[i++]=a[m++]; } return 0;}//递归实现排序int mergesort(int a[],int low,int high,int tmp[]){ int mid; if(low<high) { mid=(low+high)/2; mergesort(a,low,mid,tmp); mergesort(a,mid+1,high,tmp); Merger(a,low,high,tmp); } return 0;}int main(){ int a[10]={3,7,9,10,56,2,34,45,53,90},c[10],i;mergesort(a,0,9,c);for(i=0;i<10;i++){printf("%d\t",c[i]);} return 0;}</span>
0 0
- 排序—归并排序
- 排序——归并排序
- 排序——归并排序
- 排序——归并排序
- 排序——归并排序
- 排序——归并排序
- 排序——归并排序
- 排序——归并排序
- 排序——归并排序
- 排序——归并排序
- 排序算法—归并排序
- 内部排序—归并排序
- 排序算法—归并排序
- 数据结构 — 归并排序
- 数据结构 — 归并排序
- 排序3——堆排序,归并排序,快速排序
- 数据结构之排序——归并排序
- 排序新风格——归并排序
- NSURL
- 九九乘法表
- <C++>计算程序运行时间
- java打log
- 提取Excel文档的sheet表目录
- 排序——归并排序
- 德鲁克经典管理学书籍
- “区伯”监督行 半路出意外
- hadoop中NameNode、DataNode和Client三者之间协作关系及通信方式介绍
- (第二次作业)介绍电子标签芯片的组成及功能
- jquery分页展示控件 kkpager 使用
- storm中supervisor的启动exit问题
- 同一网段通过交换机ping 不通
- jquery分页展示控件 kkpager