归并排序
来源:互联网 发布:cms node.js 编辑:程序博客网 时间:2024/05/14 08:18
递归版
template <class T>void merge(T *a, T *b, int left, int mid, int right){int i = left, j = mid + 1, k = left;while (i <= mid && j <= right){if (a[i] > a[j])b[k++] = a[j++];elseb[k++] = a[i++];}if (i > mid)while (j <= right)b[k++] = a[j++];elsewhile (i <= mid)b[k++] = a[i++];while (left <= right)a[left] = b[left++];}template <class T>void mergeSort(T *a, T *b, int left, int right){if (left < right){int mid = (left + right) / 2;mergeSort(a, b, left, mid);mergeSort(a, b, mid + 1, right);merge(a, b, left, mid, right);}}
非递归版,a与b相互归并省去b向a赋值部分
template <class T>void merge(T *a, T *b, int left, int mid, int right){int i = left, j = mid + 1, k = left;while (i <= mid && j <= right){if (a[i] > a[j])b[k++] = a[j++];elseb[k++] = a[i++];}if (i > mid)while (j <= right)b[k++] = a[j++];elsewhile (i <= mid)b[k++] = a[i++];//while (left <= right)//a[left] = b[left++];}template<class T>void mergePass(T *a, T *b, int n, int segmentSize){int i = 0;while (i <= n - 2 * segmentSize){merge(a, b, i, i + segmentSize - 1, i + 2 * segmentSize - 1);i = i + 2 * segmentSize;}if (i + segmentSize < n)merge(a, b, i, i + segmentSize - 1, n - 1);elsefor (int j = i; j < n; j++)b[j] = a[j];}template<class T>void mergeSort(T *a, int n){T *b = new T[n];int segmentSize = 1;while (segmentSize < n){mergePass(a, b, n, segmentSize);segmentSize *= 2;mergePass(b, a, n, segmentSize);segmentSize *= 2;}delete[] b;}
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- Maven——快速入门手册(学习记录)
- 实现4G模块EC20在linux系统下的拨号上网
- java-----Socket
- MongoVUE连接mongoDB 不显示数据问题
- python:核心编程中makeTextFile.py和readTextFile.py
- 归并排序
- 解决recyclerView添加footView时,GridLayoutManager,StaggeredGridLayoutManager占满一行
- openCV 转自(http://zhang-jh04.blog.163.com/blog/static/97487172200962092332160/)
- 第一篇博客 选择最近对我帮助较大的文章
- 用命令测试安装好的OpenStack环境
- java 小论继承
- 压缩解压缩
- olap4j.jar 生成mdx语句
- openwrt 在RT5350上实现mjpg-streamer视频流输出(摄像头格式为YUYV格式)