MIT:算法导论——1.算法分析——插入排序 vs 二路归并排序


#if 0  
Input:5 2 4 7 1 3 2 6  
#endif  
  
#if 1  
#include <stdio.h>  
#include <iostream>  
#include <vector>  
#include <string>  
#include <cstdlib>  
  
using namespace std;  
  
template <typename T>  
int insertionSort( T* data, int n );  
template <typename T>  
void mergenceSort( T *data, int n );  
  
template <typename T>  
void mergeSort_Better( T data[], int n );  
template <typename T>  
void mergePass_Better( T x[], T y[], int s, int n );  
template <typename T>  
void merge_Better( T x[], T y[], int l, int m, int r );  
  
int main( void )  
{  
    vector<int> vecT;  
    int data;  
    while( cin >> data ){  
        vecT.push_back( data );  
    }  
    //mergenceSort<int>( &vecT[0], vecT.size() );  
    //insertionSort<int>( &vecT[0], vecT.size() );  
    mergeSort_Better( &vecT[0], vecT.size() );  
    for( vector<int>::iterator it = vecT.begin();  
        it != vecT.end(); ++it ){  
        cout << *it << " ";  
    }  
    cout << endl;  
  
    return 0;  
}  
  
template <typename T>  
int insertionSort( T* data, int n )  
{  
    if( data == NULL || n <= 0 )  
        return -1;  
  
    for( int i = 1; i < n; ++i ){  
        T key = data[i];  
        int j = i - 1;  
        for( ; j >= 0 && key < data[j]; --j ){  
            data[j + 1] = data[j];  
        }  
        data[j + 1] = key;  
    }  
  
    return 0;  
}  
  
//*****************二路归并——归并-->复制**********************  
template <typename T>  
void mergeArray( T *data, int nLeft, int nMid, int nRight, T *outData )  
{  
    int nLLoc, nRLoc, nLocOut;  
    nLLoc = nLeft;  
    nRLoc = nMid + 1;  
    nLocOut = nLeft;  
  
    while( nLLoc <= nMid && nRLoc <= nRight  ){  
        if( data[nLLoc] <= data[nRLoc] ){  
            outData[nLocOut++] = data[nLLoc++];  
        }else{  
            outData[nLocOut++] = data[nRLoc++];  
        }  
    }  
  
    if( nLLoc <= nMid ){  
        while( nLLoc <= nMid )  
            outData[nLocOut++] = data[nLLoc++];  
    }else if( nRLoc <= nRight ){  
        while( nRLoc <= nRight  )  
            outData[nLocOut++] = data[nRLoc++];  
    }  
  
    // 复制  
    for( int i = nLeft; i <= nRight; ++i )  
        data[i] = outData[i];  
}  
  
template <typename T>  
void mergenceSortRec( T *data, int nLeft, int nRight, T *outData )  
{  
    if( nLeft == nRight ){  
        return;  
    }else{  
        int nMid = ( nLeft + nRight ) / 2;  
        mergenceSortRec( data, nLeft, nMid, outData );  
        mergenceSortRec( data, nMid + 1, nRight, outData );  
        // 合并子程序  
        mergeArray( data, nLeft, nMid, nRight, outData );   
    }  
}  
  
template <typename T>  
void mergenceSort( T *data, int n )  
{  
    T *outData = new T[n];  
    mergenceSortRec( data, 0, n - 1, outData );  
    delete [] outData;  
}  
  
//*****************二路归并——归并复制优化**********************  
template <typename T>  
void mergeSort_Better( T a[], int n )  
{// 使用归并排序算法对a[0:n-1]进行排序  
    T *b = new T[n];  
    int s = 1;  
    while( s < n ){  
        mergePass_Better( a, b, s, n );  
        //for( int i = 0; i < n; ++i )  
        //  cout << b[i] << " ";  
        //cout << endl;  
        s <<= 1;// HIS ERROR:曾经s <<= 2;实际变成4倍  
        mergePass_Better( b, a, s, n );  
        s <<= 1;  
        //for( int i = 0; i < n; ++i )  
        //  cout << a[i] << " ";  
        //cout << endl;  
    }  
    delete [] b;  
}  
template <typename T>  
void mergePass_Better( T x[], T y[], int s, int n )  
{// merge 大小为s的相邻段  
    int left = n, i = 0;// 初始位置  
    while( i + 2 * s <= n ){  
        merge_Better( x, y, i, i + s - 1, i + 2 * s - 1 );  
        i += s << 1;  
    }  
  
    if( i + s < n ){  
        merge_Better( x, y, i, i + s - 1, n - 1 );  
    }else{  
        for( ; i < n; ++i ){  
            y[i] = x[i];  
        }  
    }  
}  
template <typename T>  
void merge_Better( T x[], T y[], int l, int m, int r )  
{// merge x[l:m] and y[m+1:r]  
    int i = l,  
        j = m + 1,  
        k = l;  
  
    while( i <= m && j <= r ){  
        if( x[i] <= x[j] )  
            y[k++] = x[i++];  
        else  
            y[k++] = x[j++];  
    }  
  
    if( i <= m ){  
        while( i <= m )  
            y[k++] = x[i++];  
    }else{  
        while( j <= r )  
            y[k++] = x[j++];  
    }  
}  
  
#endif  


分而治之 排序算法(归并排序算法)伪代码——

template <typename T>  
void mergeSort( T a[], int left, int right )  
{// 对a[left:right]中的元素进行排序  
    if( left < right ){  
        int i = ( left + right ) / 2;  
        mergeSort( a, left, i );  
        mergeSort( a, i + 1, right );  
        merge( a, b, left, i, right );// 从a合并到b  
        copy( b, a, left, right );// 结果放回a  
    }  
}  






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值