自然归并排序 c++ (原创)
2012-03-14 20:11
176 查看
今天复习算法, 自然归并算法令我挺感兴趣,结果网上找到的基本都不怎么准确,下面通过自己的一些修改,贴出一份正确的代码!
自然归并中,有一些已经自然排好序的序列,我们称其为有序子序列!
by wink.
自然归并中,有一些已经自然排好序的序列,我们称其为有序子序列!
void NaturalMergeSort(T aSrc[], int n) { T *pTmp = new T ; int aiBreakPoint ; //包含各有序子序列断点 int iBpCnt = 0; //断点数量 aiBreakPoint[iBpCnt++] = 0; //aiBreakPoint[0]永远指向第一个元素 for (int i=0; i<n-1 ; i++ ) //扫描断点 { if(aSrc[i] > aSrc[i+1]) aiBreakPoint[iBpCnt++] = i + 1; } aiBreakPoint[iBpCnt++] = n-1; while(iBpCnt > 2)//直到断点数为2 { int i=0, iNewBpCnt = 1; for (i = 0; i < iBpCnt - 2; i += 2) { Merge(aSrc, pTmp, aiBreakPoint[i], aiBreakPoint[i+1], aiBreakPoint[i+2]);//相邻两个合并 for (int j = aiBreakPoint[i]; j <= aiBreakPoint[i+2]; j++ ) //复制结果 aSrc[j] = pTmp[j]; aiBreakPoint[iNewBpCnt++] = aiBreakPoint[i+2]; } if(i == iBpCnt - 2) aiBreakPoint[iNewBpCnt++] = aiBreakPoint[iBpCnt-1]; //处理最后的孤立点 iBpCnt = iNewBpCnt; }
delete[] pTmp; } void Merge(T c[], T d[], int l, int m, int r) { // Merge c[l:m]] and c[m:r] to d[l:r]. int i = l, // cursor for first segment j = m+1, // cursor for second k = l; // cursor for result // merge until i or j exits its segment while ((i <= m) && (j <= r)) if (c[i] <= c[j]) d[k++] = c[i++]; else d[k++] = c[j++]; // take care of left overs if (i > m) for (int q = j; q <= r; q++) d[k++] = c[q]; else for (int q = i; q <= m; q++) d[k++] = c[q]; }
by wink.
相关文章推荐
- 归并排序:Sort:Merge sort using temporary int array(c++)
- 归并排序的原理,c++代码实现
- 归并排序-C++
- c++实现数据结构中的各种排序方法:直接插入、选择,归并、冒泡、快速、堆排序、shell排序
- C++数据结构 排序 二分 插入 冒泡 基数 归并 直选 快排 希尔 堆排序
- 【原创】Algorithms:原地归并排序
- C/C++ 数组,链表排序(平均时间复杂度 O(nlogn))归并、快速、堆、希尔之归并排序
- 二路归并排序,C++代码实现
- C++数据结构--归并排序
- C/C++ 数组排序(平均时间复杂度 O(nlogn))归并、快速、堆、希尔之快速排序
- [C++]Merge Two Sorted Lists 归并两个排序的链表
- C++ 归并排序的实现实例代码
- 单链表的归并、快速排序 C++
- C++ 二路归并排序
- 二分查找 归并排序 快排 详解C++
- 归并排序的一种c++实现
- 实现一个简单的c++ list容器(含sort排序 链表归并算法实现)
- 插入、希尔、快排、堆排、自然归并排序
- 归并排序的简单实现(c++ 版本)
- 算法 -- 归并排序之自然排序