가리키는 값을 기준으로 이중 포인터 배열을 어떻게 정렬할 수 있나요?

StackOverflow https://stackoverflow.com/questions/17299

문제

배열을 정렬하고 각 값을 해당 "점수" 또는 순위로 바꾸는 함수를 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?표준::맵?).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top