排序算法之归并排序

思路: 归并排序使用了分治思想进行实现。对一个数组进行二分法,使用递归实现二分法。

       首先有一个数组C,可以将C数组分为A,B两组,然后各自再把A,B分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。

    这样通过先递归的分解数列,再合并数列就完成了归并排序。

      

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

template <typename T>
void merge( T arr[], int iLeft, int iMid, int iRight )
{
    T temp[ iRight - iLeft + 1 ];
    int k = 0;
    int i = iLeft, j = iMid + 1;
    while( i <= iMid && j <= iRight )
    {
        if( arr[ i ] <= arr[ j ] )
        {
            temp[k++] = arr[i++];
        }
        else
        {
            temp[k++] = arr[j++];
        }
    }

    while( i <= iMid )    //对于左侧有序数组中多余的元素进行插入
    {
        temp[k++] = arr[i++];
    }

    while( j <= iRight )  //对于右侧有序数组中多余的元素进行插入
    {
        temp[k++] = arr[j++];
    }

    for( int l = 0; l < k; l++ )
    {
        arr[iLeft+l] = temp[l];
    }
}

template<typename T>
void mergeSort( T arr[], int iLeft, int iRight )
{
    if( iLeft >= iRight )
    {
        return;
    }
    int mid  = (iLeft + iRight)/2;
    mergeSort( arr, iLeft, mid );
    mergeSort( arr, mid+1, iRight );
    merge( arr, iLeft, mid, iRight );
}


int main( )
{
    //setbuf(stdout,NULL);
    unsigned int pucBuff[10] = {3,4,1,7,3,7,8,9,4,0};
    cout << "排序前
" << endl;
    for( unsigned int i = 0; i < sizeof(pucBuff)/sizeof(int); i++ )
    {
        cout << pucBuff[i] << " " ;
    }
    cout << endl;

    mergeSort( pucBuff, 0, sizeof(pucBuff)/4 -1 );
    cout << "排序后
" << endl;
    for( unsigned int i = 0; i < sizeof(pucBuff)/4; i++ )
    {
        cout<< pucBuff[i]<< " ";
    }
    cout<<endl;
    return 1;
}
原文地址:https://www.cnblogs.com/MrZhang1/p/6926100.html