对列表进行排序并返回其原始订单或下标

时间:2015-07-17 17:00:09

标签: c++ qt sorting quicksort

您好我正在使用Qt编写一个函数,其中将执行以下操作:

1)对qlist进行排序< double&gt ;;

2)返回每个元素的下标,其顺序为qlist< double>或返回每个元素的原始顺序

例如:

原始qlist:2.3,1.8,4.5,3.6 返回值:1,0,3,2(因为排序后qlist为:1.8,2.3,3.6,4.5)

基于快速排序,我写了一个如下,但速度非常慢。时间成本约为:

10,000需要13.9168

100,000需要120.387秒

你能给我一些建议来优化这段代码吗?在此先感谢。

#include <QString>
#include <QVector>
#include <QDebug>
#include <QTime>
#include "sys/time.h"


void subArrayQuickSort(QList<double> * targetArray, QVector <qint64> * subArray, qint64 min, qint64 max);

int main(){
    QList<double> pvalue;
    QVector<qint64> subscript;
    qint64 totalNumber = 10000;

    struct timeval tpstart,tpend;
    for(qint64 i =0; i< totalNumber; i++){
        qsrand((uint)QTime::currentTime().msec());
        double tmpNumber = 1.0 * ( qrand() % 100000 /100000 ) ;

        pvalue.append(tmpNumber);
        subscript.append(i);
    }

    qDebug() << "sort start ...";
    gettimeofday(&tpstart,NULL);
    subArrayQuickSort(&pvalue,&subscript,0,totalNumber-1);

    gettimeofday(&tpend,NULL);
    qDebug() << "time cost:" << (1000000*(tpend.tv_sec-tpstart.tv_sec) + tpend.tv_usec-tpstart.tv_usec)/1000000.0;

    return 0;

}

// sort the subscript of the array desc
void subArrayQuickSort(QList<double> * targetArray, QVector <qint64> * subArray, qint64 min, qint64 max){
    if(min>=max){
        return;
    }
    qint64 first = min;
    qint64 last = max;
    qint64 refSub = subArray->at(first);
    double refSubValue = targetArray->at(refSub);
    while (first < last) {
        while (first < last && targetArray->at(subArray->at(last)) <= refSubValue ) {
            last--;
        }
        subArray->replace(first,subArray->at(last));

        while (first < last && targetArray->at(subArray->at(first)) >= refSubValue ) {
            first++;
        }
        subArray->replace(last,subArray->at(first));
    }
    subArray->replace(first,refSub);
    subArrayQuickSort(targetArray,subArray,min,first - 1);
    subArrayQuickSort(targetArray,subArray,first + 1, max);
}

1 个答案:

答案 0 :(得分:1)

任务是对跟踪索引的内容进行排序。使用&#34;排序&#34;由C ++提供的STL算法将比创建自己的轮子更好。一种可能的解决方案是:C++ sorting and keeping track of indexes

要在QT中充分利用C ++ 11 lambda,请输入

  

CONFIG + = c ++ 11

<。>在.pro文件中。

快速排序有一些技巧可以降低你的代码速度。更好的快速排序实现可以参考&#34;第11列:排序&#34; in book&#34; Programming Peals,Second Edition&#34;。