您好我正在使用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);
}
答案 0 :(得分:1)
任务是对跟踪索引的内容进行排序。使用&#34;排序&#34;由C ++提供的STL算法将比创建自己的轮子更好。一种可能的解决方案是:C++ sorting and keeping track of indexes。
要在QT中充分利用C ++ 11 lambda,请输入
<。>在.pro文件中。CONFIG + = c ++ 11
快速排序有一些技巧可以降低你的代码速度。更好的快速排序实现可以参考&#34;第11列:排序&#34; in book&#34; Programming Peals,Second Edition&#34;。