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

    在一些语言(例如Java)中,当排序一般的对象时,元素的比较耗时很多,但是移动元素就快得多。在所有流行的排序算法中,归并排序使用最少次数的比较。因此,在Java中,归并排序是一般目的排序的最佳选择。

    编码实现如下:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    template <typename Comparable>
    void mergeSort( vector<Comparable> &a,
                    vector<Comparable> &tmpArray,int left,int right )
    {
        if ( left < right ){
            int center = ( left + right ) / 2;
            mergeSort( a,tmpArray,left,center );                        //左右两边进行排序
            mergeSort( a,tmpArray,center + 1,right );
            merge( a,tmpArray,left,center + 1,right );                  //最后合并两个有序表
        }
    }
    
    template <typename Comparable>
    void mergeSort( vector<Comparable> &a )                             //驱动函数
    {
        vector<Comparable> tmpArray( a.size() );
    
        mergeSort( a,tmpArray,0,a.size() - 1 );
    }
    
    template <typename Comparable>
    void merge( vector<Comparable> &a,vector<Comparable> &tmpArray,
                int leftPos,int rightPos,int rightEnd )
    {
        int leftEnd = rightPos - 1;
        int tmpPos = leftPos;
        int numElement = rightEnd - leftPos + 1;
    
        while( leftPos <= leftEnd && rightPos <= rightEnd )             //主循环将两部分循环复制进临时数组
            if ( a[leftPos] <= a[rightPos] )
                tmpArray[tmpPos++] = a[leftPos++];
            else
                tmpArray[tmpPos++] = a[rightPos++];
    
        while ( leftPos <= leftEnd )                                    //将剩余的部分拷贝
            tmpArray[tmpPos++] = a[leftPos++];
    
        while ( rightPos <= rightEnd )
            tmpArray[tmpPos++] = a[rightPos++];
    
        for ( int i = 0 ; i < numElement ; i++,rightEnd-- )
            a[rightEnd] = tmpArray[rightEnd];
    }
    
    int main()
    {
        cout << "请输入一些数据:" << endl;
    
        vector<int> vec;
        int temp;
    
        while ( cin >> temp )
            vec.push_back( temp );
    
        mergeSort( vec );
    
        cout << "按升序排列过的数据如下:" << endl;
    
        vector<int>::iterator iter = vec.begin();
        while( iter != vec.end() )
            cout << *iter++ << endl;
    
        return 0;
    }
    我们一路奋战,不是为了改变世界,而是不让世界改变我们 ——《熔炉》
  • 相关阅读:
    用python解析html--SGMLParser
    Python相对完美的URL拼接函数
    Java将视频转为缩略图--ffmpeg
    卡夫卡(kafka)
    Qt 学习之路 2
    QT的Paint 系统
    Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转
    QImage对一般图像的处理
    Hough变换-理解篇
    从零开始学习无人驾驶技术 --- 车道检测
  • 原文地址:https://www.cnblogs.com/ZRBYYXDM/p/5191234.html
Copyright © 2011-2022 走看看