lastname — это поле в записи, EmployeeRecord, как определено в record.h, я пытаюсь использовать
Qsort для сортировки строки в employee [emptotal] .lastname.
#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 pivot []. 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;
Во-первых, в вашем коде много ошибок.
Вам определенно нужно посмотреть на них.
И кажется, что вы сортируете запись на основе lastname
Почему ты не используешь qsort
?
Что-то вроде этого:
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);
Других решений пока нет …