gpt4 book ai didi

c - 使用快速排序对带有指针的数组进行排序

转载 作者:行者123 更新时间:2023-11-30 14:36:55 27 4
gpt4 key购买 nike

我正在尝试使用快速排序对数组“选项卡”中的值进行排序,但它不起作用。 main 函数只是为每个选项卡设置姓名和工资[n]

typedef struct employee Employee;

struct employee{
char name[81];
float salary;
};

Employee *tab[10];

void sort(Employee **tab, int begin, int end){
int p = tab[(begin + end) / 2] , i = end, j = begin;
/*p is the pivot*/
do{
while(tab[i]->salary < p && i < end) i++;
while(tab[j]->salary > p && j > begin) j--;

if(i <= j){
int tmp = tab[i]->salary;
tab[i]->salary = tab[j]->salary;
tab[j]->salary = tmp;
i++; j--;
}
}while(i <= j);

if(begin < j) sort(tab, begin, j);
if(end > i) sort(tab, i, end);
}

最佳答案

评论中注明的更改。这是降序排序(如后续问题中所要求的)。

#include <stdio.h>

typedef struct employee{
char name[81];
float salary;
}Employee;

void sort(Employee **tab, int begin, int end){
float p = tab[(begin + end) / 2]->salary; /* float needed for compare == */
int i = begin, j = end;
Employee *tmp; /* microsoft is c89 */

while(i <= j){ /* using while */
while(tab[i]->salary > p) i++; /* >, <= pivot stops scan */
while(tab[j]->salary < p) j--; /* <, >= pivot stops scan */
if(i > j) /* using break */
break;
tmp = tab[i];
tab[i] = tab[j];
tab[j] = tmp;
i++; j--;
}

if(begin < j) sort(tab, begin, j);
if(end > i) sort(tab, i, end);
}

int main(int argc, char**argv)
{
Employee tab[] = {{"john", 525.}, {"jack", 520.},
{"mary", 537.}, {"jane", 523.},
{"joan", 548.}, {"sam", 524.},
{"lisa", 527.}, {"ann", 541.},
{"tom", 521.}, {"ted", 531.}};
Employee *ptr[sizeof(tab)/sizeof(tab[0])];
int i;
/* create array of pointers */
for(i = 0; i < (sizeof(tab)/sizeof(tab[0])); i++)
ptr[i] = &tab[i];
sort(ptr, 0, sizeof(ptr)/sizeof(ptr[0])-1);
for(i = 0; i < (sizeof(ptr)/sizeof(ptr[0])); i++)
printf("%5s %6.2f\n", ptr[i]->name, ptr[i]->salary);
return 0;
}

关于c - 使用快速排序对带有指针的数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57750049/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com