数据结构基础(5) --归并排序
来源:互联网 发布:linux pyqt5 安装 编辑:程序博客网 时间:2024/05/14 02:01
归并排序的基本思想:
将两个或两个以上的有序子序列”归并”为一个有序序列:假定待排序表含有n个记录, 则可以看成是n个有序的子表, 每个子表长度为1, 然后两两归并, 得到[n/2]个长度为2或1的有序表,; 再量量归并, ...., 如此重复, 直到合并成为一个长度为n的有序表为止, 这种排序方法称为2-路归并排序.如图为一个2-路归并排序的一个示例:
/**说明:将有序的记录序列 initList[left:mid] 和 initList[mid+1:right]归并为有序的记录序列 initList[left:right] initList: 原始的有序序列[分为两段] tmpList: 合并过程中需要的中间序列 left: initList最左边元素的下标 mid: 指向第一个有序序列的最后一个元素的下标 right: initList最右边元素的下标*/template <typename Type>int Merge(Type *initList, Type *tmpList, int left, int mid, int right){ //先将待归并的数组复制到tmpList中去 std::copy(initList+left, initList+right+1, tmpList+left);// 同下:// for (int i = left; i <= right; ++i)// {// tmpList[i] = initList[i];// } int s1 = left, s2 = mid+1; int iResult = left; while (s1 <= mid && s2 <= right) { if (tmpList[s1] <= tmpList[s2]) { initList[iResult ++] = tmpList[s1 ++]; } else { initList[iResult ++] = tmpList[s2 ++]; } } int *end; if (s1 <= mid) end = std::copy(tmpList+s1, tmpList+mid+1, initList+iResult); if (s2 <= right) end = std::copy(tmpList+s2, tmpList+right+1, initList+iResult); return end - (initList+left);// 同下:其实这两个循环只有一个会执行// while (s1 <= mid)// {// initList[iResult ++] = tmpList[s1 ++];// }// while (s2 <= right)// {// initList[iResult ++] = tmpList[s2 ++];// }//// return iResult;}
//二路归并排序-递归算法template <typename Type>void mergeSort(Type *initList, Type *tmpList, int left, int right){ if (left >= right) return; int mid = (left+right)/2; mergeSort(initList, tmpList, left, mid); //先将左边元素排序 mergeSort(initList, tmpList, mid+1, right); //后将右边元素排序 Merge(initList, tmpList, left, mid, right); //合并}
可以看出对n个记录进行归并排序的时间复杂度为Ο(nlogn)。即:
(1)每一趟归并(合并)的时间复杂度为 O(n);
(2)总共需进行[logn]趟。
2 0
- 数据结构基础(5) --归并排序
- 数据结构基础(5) --归并排序
- 数据结构基础(5) --归并排序
- 数据结构基础(5) --归并排序
- 【数据结构基础】归并排序
- 数据结构基础7.4:归并排序
- 数据结构基础(14)------------归并排序
- 数据结构基础 归并排序 java 实现
- 基础数据结构算法_快速排序,堆排序,归并排序
- 数据结构 排序 归并排序
- 【数据结构】:排序--归并排序
- 数据结构排序--归并排序
- 【基础排序】归并排序
- 基础排序:归并排序
- 数据结构之归并排序
- 数据结构--归并排序
- 【数据结构】归并排序
- 数据结构 - 归并排序
- linux 管道传递socket套接字
- 生产者和消费者的多线程问题
- 程序设计基石与实践之数据成员与set和get函数
- 你用icloud网页关闭激活锁功能
- 关于ajax跨服务器读取数据的验证
- 数据结构基础(5) --归并排序
- java黑马基础题
- Web前端开发与iOS终端开发的异同
- 怎么熟悉一个项目
- libevent带负载均衡的多线程使用示例
- 【BZOJ2876】【NOI2012】骑行川藏 拉格朗日乘数、
- 重温WIN32 API ------ 最简单的Windows窗口封装类
- 【逆元】【bzoj 3823】: 定情信物
- 2015当前最火的web开发技术