c++归并排序
来源:互联网 发布:阿里云余额如何提现 编辑:程序博客网 时间:2024/06/13 06:44
广为人知的排序算法有冒泡排序,还有选择排序,插入排序。高级一些的有快速排序,希尔排序,堆排序,归并排序,基数排序等。其中时间复杂度为O(n*logn)的算法有快速排序,归并排序和堆排序等;时间复杂度为O(n2)的算法有冒泡排序,选择排序和插入排序等。
今天在这给大家介绍下归并排序。该算法是采用“分治法”的一个典型应用,采用递归的方法。过程分为三步:
划分:每次以中间点为界限将数据分为两个子区间,直到最后每个子区间中含有两个元素或者一个元素;
排序:然后对每个子区间中的数据进行排序;
合并:不断迭代地将相邻的两个子区间合并为一个新的有序区间;
c++实现代码
1 void merge_sort(int *data, int start, int end, int *result) 2 { 3 if(1 == end - start)//如果区间中只有两个元素,则对这两个元素进行排序 4 { 5 if(data[start] > data[end]) 6 { 7 int temp = data[start]; 8 data[start] = data[end]; 9 data[end] = temp;10 }11 return;12 }13 else if(0 == end - start)//如果只有一个元素,则不用排序14 return;15 else16 {17 //继续划分子区间,分别对左右子区间进行排序18 merge_sort(data,start,(end-start+1)/2+start,result);19 merge_sort(data,(end-start+1)/2+start+1,end,result);20 //开始归并已经排好序的start到end之间的数据21 merge(data,start,end,result);22 //把排序后的区间数据复制到原始数据中去23 for(int i = start;i <= end;++i)24 data[i] = result[i];25 }26 }merge的过称为
void merge(int *data,int start,int end,int *result) 2 { 3 int left_length = (end - start + 1) / 2 + 1;//左部分区间的数据元素的个数 4 int left_index = start; 5 int right_index = start + left_length; 6 int result_index = start; 7 while(left_index < start + left_length && right_index < end+1) 8 { 9 //对分别已经排好序的左区间和右区间进行合并10 if(data[left_index] <= data[right_index])11 result[result_index++] = data[left_index++];12 else13 result[result_index++] = data[right_index++];14 }15 while(left_index < start + left_length)16 result[result_index++] = data[left_index++];17 while(right_index < end+1)18 result[result_index++] = data[right_index++];19 }测试程序:
1 int main() 2 { 3 int data[] = {9,6,7,22,20,33,16,20}; 4 const int length = 8; 5 int result[length]; 6 cout << "Before sorted:" << endl; 7 for(int i = 0;i < length;++i) 8 cout << data[i] << " "; 9 cout << endl;10 cout << "After sorted:" << endl;11 merge_sort(data,0,length-1,result);12 for(int i = 0;i < length;++i)13 cout << data[i] << " ";14 cout << endl;15 16 return 0;17 }归并排序的时间复杂度为O(n*logn)。
阅读全文
0 0
- 归并排序(C/C++)
- 归并排序(C)
- 归并排序 --- C语言版
- C++_归并排序
- 归并排序C语言
- 【C++】归并排序
- 归并排序C语言版
- 归并排序(C语言版)
- 归并排序(c++)
- 归并排序C语言
- C语言 归并排序
- 归并排序 C语言数据结构
- 归并排序 c语言实现
- 归并排序(C语言)
- 读书笔记—C 归并排序
- 归并排序C语言实现
- 归并排序C语言实现
- 归并排序C语言代码
- JavaScript判断数组是否存在key
- iOS解析HTML标签
- Android USB 设备 Applications、FrameWork、HAL层简单分析
- Spring的dispatcherServlet-servlet.xml配置文档
- JAVA代码获取MAC地址
- c++归并排序
- 点宏染整厂ERP生产管理系统介绍
- df和du显示的磁盘空间使用情况不一致的原因及处理
- 51keil与proteus联调,实现在线仿真
- 【网络流之最大流算法模板】HDUOJ 3549 Flow Problem
- 归并排序
- 设计模式之多例模式
- 自己配置的谷歌浏览器插件
- 设计编写用例注意事项