• 排序算法之归并排序


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

           首先有一个数组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;
    }
  • 相关阅读:
    学习方法
    编译原理词法分析程序
    06_05_词法分析
    顺序队列的基本操作
    使用默认参数的构造函数
    基于顺序栈的进制转换
    C语言之大数相加
    输入一个年输出其天干地支纪年法的表达式
    队列的链式存储及其基本运算
    队列的顺序存储及其基本操作
  • 原文地址:https://www.cnblogs.com/MrZhang1/p/6926100.html
Copyright © 2020-2023  润新知