2013-07-29 4 views
0

lastname은 record.h에 ​​정의 된 EmployeeRecord 레코드의 필드입니다. Qsort를 사용하여 직원 [emptotal] .lastname의 문자열을 정렬하려고합니다.Qsort의 레코드 배열을 c 또는 C++로 사용

#include "./record.h" 

void externalSort(EmployeeRecord *lastname,int empcount,int emptotal) 
{ 
empcount = 0; 
emptotal = 5; 
EmployeeRecord employee[emptotal]; 
int left=empcount, 
right=emptotal; 
EmployeeRecord pivot[].lastname = employee[(empcount+emptotal)/2].lastname; 

    while (left < right) { 
// find left candidate 
    while (&employee[left].lastname < &pivot[(empcount+emptotal)/2].lastname) left++; 
// find right candidate 
    while (&employee[right].lastname > &pivot[(empcount+emptotal)/2].lastname) right--; 
    if (left <= right) { 
    EmployeeRecord &temp.lastname = &employee[left].lastname; 
    &employee[left].lastname = &employee[right].lastname; 
    &employee[right].lastname = &temp.lastname; 
    left++; 
right--; 
    } 
} // while left < right 
if (empcount < right) externalSort(char *lastname,empcount,right); 
if (left < emptotal) externalSort(char *lastname,left,emptotal); 

} 

내가 처음 몇 줄을 할 수있는 올바른 방법에 관해서는 손해를보고, 그래서 여러 가지 변화가 있었다 미안 해요는, 내 주요 문제는 선언 라인이며, 다음은 EmployeeRecord 피벗 [] .lastname = employee [(empcount + emptotal)/2] .lastname; 피벗을 올바르게 선언하는 방법을 알고 나면 올바르게 정렬을 지정하는 방법을 알게 될 것입니다.

(또한 그것은 임시 할당에 도움이 될 것입니다.)

(record.h 도움이된다면) 모든

typedef char STR9[9+1]; 
typedef char STR7[7+1]; 
typedef char STR16[16+1]; 
typedef struct EmployeeRecord 
{ 
    STR9 lastname; 
    STR7 firstname; 
    STR16 fullname; 
    float hours, 
     overhours, 
     pay_rate, 
     defered, 
     gross, 
     fedtax, 
     statetax, 
     ssitax, 
     netpay; 
} EmployeeRecord; 
+0

당신은 사용해야합니다'을 strcmp (직원 [왼쪽 ] .lastname, pivot [(empcount + emptotal)/2] .lastname)'& employee [left] .lastname 대신에 <0'. & pivot [(empcount + emptotal)/2] .lastname' – higuaro

+0

내 원래의 질문이 아닙니다. 그러나 당신의 충고에 감사드립니다. –

답변

0

첫째, 코드에서 오류가 많이.

꼭 살펴 봐야합니다.

그리고 당신이

qsort 사용하지 않는 lastname을 기준으로 레코드를 정렬하고 있음을 나타 납니까? 이 같은

뭔가 :

const int no_of_employee =100; 

EmployeeRecord *ER[no_of_employee]; 

static int compare(const void *e1, const void *e2) 
{ 
    EmployeeRecord *tmp1 =*(EmployeeRecord **)e1; 
    EmployeeRecord *tmp2 =*(EmployeeRecord **)e2; 
    return strcmp(tmp1->lastname,tmp2->lastname); 
} 


qsort (ER, no_of_employee, sizeof(EmployeeRecord *), compare); 

또한, 나는 더 간단하게 STL을 사용하는 것이 좋습니다 것입니다.

그것의 매우 단단하고 코드의 모든 버그, 코드를 다음과 같이 공동-관련하여 버그를 분석 지적하는 (약. 당신의 코드와 유사)

void swap(EmployeeRecord *e1, EmployeeRecord *e2) 
{ 
    EmployeeRecord tmp ; 
    tmp = *e1; 
    *e1 = *e2; 
    *e2 = tmp; 
} 

void externalSort(EmployeeRecord employee[], int start, int end){ 
    if(start < end){ 
     int left=start+1, right=end; 
     EmployeeRecord pivot = employee[start]; 
     while(left<right){ 
      if(strcmp(employee[left].lastname, pivot.lastname) < 0) 
       left++; 

      else if(strcmp(employee[right].lastname, pivot.lastname) > 0) 
       right--; 
      else 
       swap(&employee[left],&employee[right]); 
     } 
     if(strcmp(employee[left].lastname, pivot.lastname) < 0){ 
      swap(&employee[left],&employee[start]); 
      left--; 
     } 
     else{ 
      left--; 
      swap(&employee[left],&employee[start]); 
     } 
     externalSort(employee, start, left); 
     externalSort(employee, right, end); 
    } 
} 

    // externalSort(employee, 0, emptotal); 
+0

"쉬운"버전을 사용할 수 있기 때문에 Qsort 작품을 알아야합니다. 이것이 qsort를 사용하지 않는 이유입니다. 피벗을 설정하는 올바른 방법을 배우고 싶습니다. 고맙습니다. 앞으로 이것을 사용하겠습니다. –