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;
    }
    我们一路奋战,不是为了改变世界,而是不让世界改变我们 ——《熔炉》
  • 相关阅读:
    关于lockkeyword
    关于多层for循环迭代的效率优化问题
    Android 面试精华题目总结
    Linux基础回想(1)——Linux系统概述
    linux源代码编译安装OpenCV
    校赛热身 Problem C. Sometimes Naive (状压dp)
    校赛热身 Problem C. Sometimes Naive (状压dp)
    校赛热身 Problem B. Matrix Fast Power
    校赛热身 Problem B. Matrix Fast Power
    集合的划分(递推)
  • 原文地址:https://www.cnblogs.com/ZRBYYXDM/p/5191234.html
Copyright © 2011-2022 走看看