zoukankan      html  css  js  c++  java
  • 排序算法之归并排序

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

           首先有一个数组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;
    }
  • 相关阅读:
    eclipse恢复界面默认设置
    文件夹的拷贝
    文件的输入输出
    十进制转二进制,八进制,十六进制(查表法)
    数组元素的查找(折半查找)
    C++几个小函数
    C++ 内部排序(一)
    C++实现链表
    C++输出IP地址段内的合法地址
    我看软件工程师的职业规划
  • 原文地址:https://www.cnblogs.com/MrZhang1/p/6926100.html
Copyright © 2011-2022 走看看