2017-10-26 2 views
-1

A의 값으로 정렬 된 A [크기]에 대한 인덱스가 포함되어야하는 목록 int A [크기] 및 목록 maxA [크기]가 있습니다. 기본적으로 A [maxA [ 0]]는 A에서 가장 큰 int의 요소 여야하고 maxA [0]는 인덱스 여야합니다. 여기 qsort를 사용하여 다른 목록을 기준으로 목록 정렬

내 비교 함수 :

int compareA(const void *a,const void *b){ 
    return A[*(TYPE *)b] - A[*(TYPE *)a]; 
} 

그리고

qsort(maxA,SIZE_L,sizeof(int),compareA); 

으로 호출 I 랜덤 possitive 번호에 의해 요소의 값을 증가시키고 루프 때 A [i]를 > L (L은 엔딩리스트로 정의되며 임의적입니다.) :

A[maxA[i]] = INT_MIN; 

그것 얼마 후에 그것은 작동을 멈 춥니 다. 다음은 출력입니다.

INDEX VALUE 
1 320 
2 207 
8 -437 
3 -681 
4 -960 
6 -1638 
5 -2928 
9 -7395 
7 -19272 
0 -2147483648 
Removed: 1 
6 -1560 500     
5 -2684 1000     
9 -7140 1066     
7 -18396 1168    
1 -2147483648 
0 -2147483648 
2 276 
3 0 
8 -418 
4 -864 

왜이 임의의 동작이 발생합니까?

+2

코드를 설명하는 대신 ("목록이 있습니다 ..."), [최소, 완전하며 검증 가능한 예제] (http://stackoverflow.com/help/mcve)를 만들어 보여주십시오. –

+1

전문 용어에주의하십시오. 두 개의 배열이 있습니다. 목록에는 "링크 된 목록"이라는 의미가 있으며 이는 매우 다릅니다. –

+0

'qsort_r()'을 찾아 보길 원할 수도 있지만, 비표준이며 다른 플랫폼은 같은 이름에 대해 (완전히 호환되지 않는) 인터페이스를 구현합니다. –

답변

1

못생긴 해킹을하지 않는 한 원하는 일은 다소 불가능합니다. qsort은이 기능을 지원하지 않습니다.

사용자 지정 정렬 기능을 쓸 수 있습니다. 정렬 알고리즘을 선택하고 웹에서 일부 코드를 검색하십시오. 버블 정렬, 선택 정렬 및 삽입 정렬은 구현하기가 쉽습니다. 일반적인 경우에 더 많은 성능을 원하면 빠른 정렬, 병합 정렬 또는 힙 정렬을 살펴볼 수 있습니다. 정수 배열을 원할 경우 버킷 정렬을 살펴볼 수 있습니다. 그렇게하면 코드를 간단하게 수정할 수 있습니다. 그냥 단순히 인수 목록에 두 번째 배열과 크기를 추가

void sort(int * arr, size_t size) 
{ 
    ... 
    if([i]<arr[i+1]) { 
     swap(arr[i], arr[i+1]) 
    } 
    ... 
} 

void sort(int * arr, size_t size, int * arr2, size_t size2) 
{ 
    ... 
    if(arr[i]<arr[i+1]) { 
     swap(arr[i], arr[i+1]) 
     swap(arr2[i], arr2[i+1]) 
    } 
    ... 
} 

에 다음 두 배열에서 동일한 변경을 수행

예를 들어, 변경할 수 있습니다.

조나단 레이 플러 (Jonathan Leffler)가 지적했듯이 listarray이라는 단어를 어떻게 사용하는지 조심하십시오. 목록은 일반적으로 링크 된 목록입니다. 정렬하기가 다소 까다 롭지 만 원하는 경우 코드 예제를 찾는 것은 매우 쉽습니다. qsort으로이 문제를 해결하려고 했으므로 배열에 대해 말하는 것으로 가정합니다.

기존 qsort을 사용하려는 경우 가장 좋은 방법은 먼저 구조체 배열을 만드는 것입니다. 이런 식으로 :

typedef struct { 
    int A; 
    int maxA; 
} comboElement; 

... 
comboElement mergedList[size]; 
for(int i=0; i<size; i++) { 
    mergedList[i].A = A[i]; 
    mergedList[i].maxA = maxA[i]; 
} 

qsort(mergedList, size, sizeof(mergedList[0]),compareMergedList); 

물론 비교 기능을 다시 작성해야합니다. 여기에 있지 않은 쪽 : qsort을 호출 할 때 sizeof <type>을 사용하지 마십시오. 대신 sizeof <first element in list>을 사용하십시오. 그 이유는 앞으로 유형을 변경하면 모든 인스턴스를 변경하는 것을 잊을 수 있기 때문입니다.