非递归归并排序(二路合并排序),非递归合并排序
来源:互联网 发布:邮币交易软件 编辑:程序博客网 时间:2024/06/07 07:21
google了一下没找到像样的(实现太复杂,太低效),自己写一个发出来。以后还是要多贴些东西吧,不然博客很空! 下面的如果有可以改进的地方,表忘了告诉我。
自底向上的归并排序,举个例子吧还是:
现在要把下面的数组按递增顺序排列
9 8 7 6 5 4 3 2 1
step1:(len=1) 8 9 6 7 4 5 2 3 1
step2:(len=2) 6 7 8 9 2 3 4 5 1
step3:(len=4) 2 3 4 5 6 7 8 9 1
step4:(len=8) 1 2 3 4 5 6 7 8 9
每次归并分组都有空格隔开了的,其中len的意思是:把数组中长度为len的相邻的两段进行合并,当len大于数组长度是结束。
so easy! 应该容易理解吧. 具体实现见下面代码。
template <class T, class C>void msort( T* table, const int& size, C cmp ){int flag = 0;T* tmp = new T[size];T* src;T* dst;int b1, b2, e1, e2, len, index, di;for( len = 1; len <= size; len *= 2 ) //! O(logn){if( flag % 2 == 0 ) src = table, dst = tmp;else src = tmp, dst = table;for( index = 0; index < size; index += ( len<<1 ) ) //! O(n){if( index + len > size ){for( di = index; di < size; di++ ) dst[di] = src[di];break;}b1 = index, b2 = index + len, e1 = b1 + len, e2 = b2 + len, di = index;if( e2 > size ) e2 = size;while( b1 < e1 && b2 < e2 )dst[di++] = cmp( src[b1] ,src[b2] ) ? src[b1++] : src[b2++];while( b1 < e1 )dst[di++] = src[b1++];while( b2 < e2 )dst[di++] = src[b2++];}flag++;}if( flag % 2 == 1 )memcpy( table, dst, sizeof( int ) * size );delete [] tmp;}
test code:
bool cmp( const int& a, const int& b ) { return a < b; }int main(){int hsize = 20;int testa[20] = \
{ 17 , 92, 3, 88, 5, 6, 7, 8, 9, 40, 11, 12, 13, 14, 25, 16, 87, 18, 19, 20 };msort( testa, hsize, cmp );for( int i = 0; i < hsize; i++ )std::cout<<testa[i] << " ";std::cout<< "\n";return 0;}
- 非递归归并排序(二路合并排序),非递归合并排序
- 合并排序(归并排序)的递归和非递归
- 非递归合并排序
- 非递归合并排序
- 合并排序-非递归
- 归并排序(递归实现+非递归实现+自然合并排序)
- 归并排序递归及非递归实现(自然合并排序)
- 合并排序算法(非递归)
- 合并排序(非递归算法)
- 非递归实现合并排序
- 合并排序非递归实现
- 归并排序三种实现方法(递归、非递归和自然合并排序)
- 归并排序 非递归
- 归并排序非递归
- 归并排序(非递归)
- 归并排序(非递归)
- 归并排序(非递归)
- 归并排序(非递归)
- showModalDialog清除缓存
- 和一个技术学者的对话
- String.Empty
- Message,MessageQueue,Looper,Handler详解+实例
- android——dip与屏幕density无关的解读
- 非递归归并排序(二路合并排序),非递归合并排序
- 为什么中国的程序员技术偏低
- 面试题-三维数组
- windows server 2008 系统服务详解和优化配置
- 警告 1 warning C4996: 'gets': This function or variable may be unsafe.类似情况
- ARM汇编--寻址方式
- ArcGIS地图平移白边问题如何解决
- 说说ARM汇编的LDR伪指令
- 小米手机:雷布斯的米饭刚下锅