가리키는 값을 기준으로 이중 포인터 배열을 어떻게 정렬할 수 있나요?
문제
배열을 정렬하고 각 값을 해당 "점수" 또는 순위로 바꾸는 함수를 C/C++에서 작성하려고 합니다.정수 배열에 대한 이중 포인터 배열을 취하고 역참조된 정수 값을 기준으로 이중 포인터를 정렬합니다.나는 그것을 작동시키기 위해 꽤 여러 번 시도했지만 그것을 내릴 수 없습니다.다시 한 번, 가리키는 값을 기준으로 이중 포인터를 정렬해야 합니다.이것이 내가 가진 것입니다:
void SortArray( int ** pArray, int ArrayLength )
{
int i, j, flag = 1; // set flag to 1 to begin initial pass
int * temp; // holding variable orig with no *
for(i = 1; (i <= ArrayLength) && flag; i++)
{
flag = 0;
for (j = 0; j < (ArrayLength -1); j++)
{
if (*pArray[j+1] > *pArray[j]) // ascending order simply changes to <
{
temp = &pArray[j]; // swap elements
pArray[j] = &pArray[j+1];
pArray[j+1] = &temp;
flag = 1; // indicates that a swap occurred.
}
}
}
}
해결책
당신은 가깝습니다.교체할 때 배열 항목의 주소를 참조하고 있는데 이는 필요하지 않습니다.배열의 항목은 포인터이므로 교체해야 합니다.
아래를 참조하세요:
void SortArray( int ** pArray, int ArrayLength )
{
int i, j, flag = 1; // set flag to 1 to begin initial pass
int * temp; // holding variable orig with no *
for(i = ArrayLength - 1; i > 0 && flag; i--)
{
flag = 0;
for (j = 0; j < i; j++)
{
if (*pArray[j] > *pArray[j+1]) // ascending order simply changes to <
{
temp = pArray[j]; // swap elements
pArray[j] = pArray[j+1];
pArray[j+1] = temp;
flag = 1; // indicates that a swap occurred.
}
}
}
}
또한 확인해 보세요. Bubble Sorting에 관한 이 멋진 블로그 게시물 관심이 있으신 경우를 대비해(죄송합니다, 뻔뻔한 플러그 :)).숙제에 도움이 되길 바라요 ;)
편집하다:배열 길이에서 다시 계산하고 내부 루프에서 'i'까지만 증가하는 미묘한 "최적화"에 주목하세요.이렇게 하면 이미 정렬된 항목을 불필요하게 다시 분석하지 않아도 됩니다.
다른 팁
흥, 이건 숙제가 아니야.
그렇다면 STL을 사용하여 배열을 관리하고 정렬하는 것을 고려해 보십시오.개발 및 유지 관리가 더 쉽고 std::sort 알고리즘은 버블 정렬보다 점근적으로 더 빠릅니다.
사용을 고려해야 합니다. std::swap()
교환을 하려고요.그렇다면 다음과 같이 호출하세요.
swap( obj1, obj2 );
대신:
std::swap( obj1, obj2 );
첫 번째 호출 의미론을 사용하면 적절한 네임스페이스 조회를 통해 올바른 오버로드가 있는 경우 이를 찾을 수 있습니다.다음 중 하나가 있어야 합니다.
using namespace std;
또는:
using std::swap;
어딘가에.
흠, 저는 STL에 대한 경험이 많지 않습니다.예를 들어주시겠어요?
이 프로그램은 int 벡터를 생성하고 이를 정렬한 후 결과를 표시합니다.
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
vector<int>; vec;
vec.push_back(7);
vec.push_back(5);
vec.push_back(13);
sort(vec.begin(), vec.end());
for (vector<int>::size_type i = 0; i < vec.size(); ++i)
{
cout << vec[i] << endl;
}
}
Brian Ensink의 게시물을 완성하려면 STL이 놀라움으로 가득 차 있다는 것을 알게 될 것입니다.예를 들어 std::sort 알고리즘은 다음과 같습니다.
#include <iostream>
#include <vector>
#include <algorithm>
void printArray(const std::vector<int *> & p_aInt)
{
for(std::vector<int *>::size_type i = 0, iMax = p_aInt.size(); i < iMax; ++i)
{
std::cout << "i[" << static_cast<int>(i) << "] = " << reinterpret_cast<unsigned int>(p_aInt[i]) << std::endl ;
}
std::cout << std::endl ;
}
int main(int argc, char **argv)
{
int a = 1 ;
int b = 2 ;
int c = 3 ;
int d = 4 ;
int e = 5 ;
std::vector<int *> aInt ;
// We fill the vector with variables in an unordered way
aInt.push_back(&c) ;
aInt.push_back(&b) ;
aInt.push_back(&e) ;
aInt.push_back(&d) ;
aInt.push_back(&a) ;
printArray(aInt) ; // We see the addresses are NOT ordered
std::sort(aInt.begin(), aInt.end()) ; // DO THE SORTING
printArray(aInt) ; // We see the addresses are ORDERED
return EXIT_SUCCESS;
}
배열의 첫 번째 인쇄에는 순서가 지정되지 않은 주소가 표시됩니다.두 번째는 정렬 후 순서가 지정된 주소를 표시합니다.내 컴파일러에는 다음이 있습니다.
i[0] = 3216087168
i[1] = 3216087172
i[2] = 3216087160
i[3] = 3216087164
i[4] = 3216087176
i[0] = 3216087160
i[1] = 3216087164
i[2] = 3216087168
i[3] = 3216087172
i[4] = 3216087176
STL의 <algorithm> 헤더를 살펴보세요. http://www.cplusplus.com/reference/algorithm/많은 유틸리티를 찾을 수 있습니다.자신에게 더 적합할 수 있는 다른 컨테이너 구현이 있다는 점에 유의하세요(std::list?표준::맵?).