我有一个这个程序来接收一个结构,存储它然后对它进行排序。我曾尝试使用Shell Sort,但后来我选择了Quick Sort算法。但是,当我尝试在排序后打印数组时,仍然会返回未排序的数组。请记住,我试图通过' num_aluno'。
对其进行排序CODE
typedef struct ALUNO
{
char primeiro_nome[15];
char segundo_nome[15];
int num_aluno;
float nota;
}ALUNO;
void swap(ALUNO* a, ALUNO* b)
{
ALUNO t=*a;
*a=*b;
*b=t;
}
int partition(ALUNO *studentList, int low, int high)
{
int pivot= studentList[high].num_aluno;
int i=(low-1);
int j;
for(j=low;j<=high-1;j++)
{
if(studentList[j].num_aluno<=pivot);
{
i++;
swap(&studentList[i], &studentList[j]);
}
}
swap(&studentList[i+1], &studentList[high]);
return(i+1);
}
void quickSort(ALUNO *studentList, int low, int high)
{
if(low<high)
{
int pi=partition(studentList, low, high);
quickSort(studentList, low, pi-1);
quickSort(studentList, pi+1, high);
}
}
int main()
{
ALUNO *studentList=NULL;
int currentPos, studentListSize=1;
//float grade_sum=0;
studentList=(ALUNO*)calloc(studentList, studentListSize*sizeof(ALUNO));
printf("Insira o numero de alunos \n");
scanf("%d", &studentListSize);
studentList=(ALUNO*)realloc(studentList, studentListSize*sizeof(ALUNO));
for(currentPos=0;currentPos<studentListSize;currentPos++)
{
newStudent(studentList, currentPos);
}
quickSort(studentList, 0, studentListSize);
for(currentPos=0;currentPos<studentListSize;currentPos++)
{
printStudent(studentList,currentPos);
}
free(studentList);
return 0;
}
任何帮助将不胜感激
答案 0 :(得分:0)
它不对列表进行排序的原因是,i和j在分区函数中始终是相同的值。
你应该从高-1开始j,而不是从低开始。 另外,您没有考虑studentList [i]的值。您必须保证它大于pivot,否则可能有一个小于pivot的值,但是在数组的左侧部分。
在这里,纠正了它。
int partition(ALUNO*studentList, int low, int high)
{
int pivot = studentList[high].num_aluno;
int i=low ;
int j;
for(j=high-1;j>=i;)
{
while(studentList[i].num_aluno < pivot)
i++;
while(studentList[j].num_aluno > pivot)
j--;
if(i<=j){
swap(&studentList[i], &studentList[j]);
i++;
j--;
}
}
swap(&studentList[i], &studentList[high]);
return(i+1);
}
如果您没有听说过,请另外提供建议,不要选择第一个或最后一个值作为支点。相反,使用三个策略的中位数。
三个策略的中位数:选择未排序数组中的第一个,中间和最后一个元素。按排序方式根据其值更改其位置。然后取中间值并将其用作枢轴。这样就可以避免QuickSort的最差时间复杂度(O(n ^ 2))。