C++中的指针数组排序算法

Pointer Array Sorting Algorithm in C++

本文关键字:数组排序 算法 指针 C++      更新时间:2023-10-16

希望我能得到一些关于我所做排序方法的建议。

这只是我正在做的另一个程序的测试,这个测试有一个我无法理解的错误。此代码的目的是创建一个int指针数组,并根据常规int数组的内容对该数组中的指针进行排序。

这个错误是针对我的第二个for循环,它不允许我使用j=-1,因此不允许我对数组的第一个元素进行排序。请帮忙。谢谢

 //create array
 int c[8] = {3,1,5,7,8,2,6,4};
 //create pointer array
 int *newptr[8];
 for(int k = 0; k<8; k++)
 {
     newptr[k] = &c[k];
 }
//sort pointer array
for(int j = 0; j<8; j++)
{
    cout << "test1nn";
    cout << *newptr[j] << "and" << *newptr[j+1];
    for(;*newptr[j] < *newptr[j+1] && j!=0; j--) 
    //using j!=-1 doesn't work which causes me to not be able to sort the first element
    //in the array properly
    {
        cout<< "test2";
        int *temp;
        temp = newptr[j+1];
        newptr[j+1] = newptr[j];
        newptr[j] = temp;
    }
}**

订单很重要。

更改

for(;*newptr[j] < *newptr[j+1] && j!=0; j--) 

至:

for(; j != -1 && *newptr[j] < *newptr[j+1]; j--) 

大概是这个错误导致了代码崩溃。发生这种情况是因为for循环中的表达式是从左到右求值的。因此,在检查j != -1之前,对*newptr[j]进行评估。因此,可以想象,在某个点上,当评估*newptr[j]时,j等于-1,这是非法的。

改变顺序确实会产生影响,原因还有二:短路评估。

当对由两个条件AB组成的表达式求值时,C++并不总是需要对这两个条件求值。

例如在语句中

if (A && B) {
  //do something 
}

如果A被评估为false,那么显然无论B评估为什么,A && B都不能评估为true。因此B的值甚至从未被检查过。因此,在您的情况下,在表达式中

j != -1 && *newptr[j] < *newptr[j+1]

如果j != -1为false,C++将不需要对表达式的其余部分进行求值来知道整个表达式为false。所以*newptr[j]永远不会发生,你也不会得到错误。

正如maditya所指出的,问题是表达式在检查索引本身之前试图访问无效索引,但我发现问题被标记为C++。你有没有明确的理由不使用STL?

struct sorter {
  bool operator() (const int* i, const int* j) { return (*i<*j);}
};
int c[8] = {3,1,5,7,8,2,6,4};
int *newptr[8];
for(int k = 0; k<8; k++)
  newptr[k] = &c[k];
std::sort(newptr, newptr+8, sorter());

或者在C++11:中更短

int c[8] = {3,1,5,7,8,2,6,4};
int *newptr[8];
for(int k = 0; k<8; k++)
  newptr[k] = &c[k];
std::sort(newptr, newptr+8, [](const int *i, const int *j){return *i < *j;});