QuickSort没有正确排序

时间:2018-01-18 21:35:04

标签: c sorting

我有一个这个程序来接收一个结构,存储它然后对它进行排序。我曾尝试使用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;
}

任何帮助将不胜感激

1 个答案:

答案 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))。