C++ 如何在平方每个元素后按递增顺序对数组排序?

C++ 如何在平方每个元素后按递增顺序对数组排序?,c++,sorting,C++,Sorting,我的代码可以得到正确的输出,但超出了时间限制。我怎样才能改进它 class Solution { public: vector<int> sortedSquares(vector<int>& A) { //sorting based on absolute values for(int i=0;i!=A.size();++i){ for(int j=0;j!=A.size();++j){

我的代码可以得到正确的输出,但超出了时间限制。我怎样才能改进它

class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {

        //sorting based on absolute values

        for(int i=0;i!=A.size();++i){
            for(int j=0;j!=A.size();++j){
                if(abs(A[i])<abs(A[j])){
                    int temp=0;
                    temp=A[i];
                    A[i]=A[j];
                    A[j]=temp;
                }
            }
        }

      //squaring each element

        for(auto &k: A){
            k*=k;
        }
        return A;
    }
};
类解决方案{
公众:
矢量分类方形(矢量和A){
//基于绝对值的排序
对于(int i=0;i!=A.size();++i){
对于(int j=0;j!=A.size();++j){

如果(abs(A[i])给你这个任务的人对你耍了点小把戏。你的目标是得到排序的正方形数组——那么为什么不先取消平方运算呢?这样做,你就可以省略对
abs()
的所有调用。也许这已经让你在时间限制以下了

第二个改进有点猜测,但值得一试。
a
不是
const
(不能是,或者您将无法对其进行排序)。这意味着编译器可以做出较少的假设来帮助优化代码。例如,它无法知道对
a.size()的所有调用
将返回相同的值。但您知道这一点,因此也可以对其进行优化

我怀疑编译器已经为您做了第三项改进,但为什么不清理它呢?为什么您要将
temp
初始化为0,只是为了在下一行给它赋值?您可以简单地将它初始化为正确的值。或者您甚至可以使用
std::swap()

类解决方案{
公众:
矢量分类方形(矢量和A){
//每个元素的平方
对于(自动和k:A){
k*=k;
}
//排序方块
自动大小=A.大小();
对于(int i=0;i!=size;++i){
对于(int j=0;j!=size;++j){
if(A[i]
是否允许将
std::sort
与自定义比较器一起使用?
std::sort
比冒泡排序快(几乎任何东西都比冒泡排序快),首先平方可能也会使排序更简单更快,因为不需要使用
abs
。这甚至不是冒泡排序的最有效实现,
j
不需要从
0
开始,每次
std::sort
的平均时间复杂度为O(nlogn),但冒泡排序很容易为O(n^2)。所以使用
std::sort
比冒泡排序更有效。@Botje我可以,但我不想使用它。但我想我没有选择。我必须选择“std::sort”。“我可以去买鞋,半小时后回来,但我宁愿去打牛,自己做皮革。”。标准库是你的朋友。这仍然是冒泡排序的低效实现。如果你想提高效率,那么你的选择可能不会是冒泡排序。不,他们应该使用
std::sort
,但问题的关键是“我如何才能让它更快”至少让冒泡排序尽可能慢是个好主意(可能会比其他更改带来更大的性能差异)。你是对的。我甚至没有注意到内部循环一直在运行。