带有功能指针的Bubblesort算法

时间:2017-02-19 10:10:49

标签: c algorithm sorting function-pointers bubble-sort

我需要一个代码,使用bubblesort算法按名称或年龄按升序对结构数组进行排序。

我阅读了所有元素,我理解了排序的一部分。问题是我应该只声明一个bubblesort算法,以便能够根据名称或年龄进行排序。当两个名字或年龄相同时,我应该比较不同的元素。为此,我应该使用函数指针。我刚开始使用函数指针,我在这里看不到任何出路。非常感谢一点帮助。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct person {
    char name [30];
    int age;
};

void bubblesort(struct person *prs, int n)
{
struct person temp;
int i, j , a,b;


for(i=0;i<n; i++)
{
    for(j=0; j <n-1; j++)
    {
        a=strcmp(prs[j].name, prs[j+1].name);
        b=prs[j+1].age - prs[j].age;

        if(a>0)
        {
            temp=prs[j];
            prs[j]=prs[j+1];
            prs[j+1]=temp;
        }
        else if(a==0 && b<0)
        {
            temp=prs[j];
            prs[j]=prs[j+1];
            prs[j+1]=temp;
        }
    }
}
}

int main()
{

int n, i;
 struct person *prs;

scanf("%d", &n);
getchar();

prs=(struct person *)malloc(sizeof(struct person)*n);

for(i=0;i<n;i++)
{
    fgets(prs[i].name, 30, stdin);
    prs[i].name[strlen(prs[i].name)-1]='\0';
    scanf("%d", &prs[i].age);
    getchar();
}

bubblesort(prs,n);

 for(i=0;i<n;i++)
 {
   printf("{%s, %d};", prs[i].name, prs[i].age);

 }
 return 0;
 }

3 个答案:

答案 0 :(得分:1)

您可以使用与标准C函数qsort使用的方法类似的方法。

向函数bubble_sort添加第三个参数。例如

void bubble_sort( struct person *p,
                  int n, 
                  int comp( const struct person *p1, const struct person *p2 ) );

虽然将函数的第二个参数声明为类型size_t

会好得多
void bubble_sort( struct person *p,
                  size_t n, 
                  int comp( const struct person *p1, const struct person *p2 ) );

然后定义两个比较struct person类型对象的函数。如果第一项小于第二项,则每个函数必须返回负值,如果第一项大于第二项,则返回正值,否则返回零。

功能看起来像

int comp_by_name( const struct person *p1, const struct person *p2 )
{
    int str_cmp = strcmp( p1->name, p2->name );
    int int_cmp = ( p2->age < p1->age ) - ( p1->age < p2->age );

    return str_cmp != 0 ? str_cmp : int_cmp;
}

int comp_by_age( const struct person *p1, const struct person *p2 )
{
    int str_cmp = strcmp( p1->name, p2->name );
    int int_cmp = ( p2->age < p1->age ) - ( p1->age < p2->age );

    return int_cmp != 0 ? int_cmp : str_cmp;
}

bubble_sort内写下以下if语句

if ( comp( &prs[j+1], &prs[j] ) < 0 )
{
    struct person tmp = prs[j+1];
    prs[j+1] = prs[j];
    prs[j] = tmp;
}

最后调用函数bubble_sort或者

bubble_sort( prs, n, comp_by_name );

如果要按名称或

对数组进行排序
bubble_sort( prs, n, comp_by_age );

如果你想按年龄排序数组。

答案 1 :(得分:0)

将此函数原型用于bubblesort:

void bubblesort(struct person *prs, int n, int (*cmp)(struct person *a, struct person *b)) {...}

现在创建一个比较函数来比较两个人:

int cmpTwoPersons(struct person *a, struct person *b) {...}

如果a> b,此函数应返回大于0的数字,如果a,则小于0

使用此比较功能调用您的bubblesort:

bubblesort(prs, n, cmpTwoPersons);

现在你在bubblesort中使用cmp

void bubblesort(...) {
    ...
    int cmpResult = cmp(prs[j], prs[j+1]);
    if (cmpResult > 0) {
        // j is large than j+1
    } else {
        // j is smaller than or equal to j+1
    }
    ...
}

答案 2 :(得分:0)

您的冒泡分类签名可以是:

void bubblesort(void **prs, int n, int (*cmp)(void *p1, void *p2))

您现在在冒泡排序中进行比较:

    int cmpResult = cmp(prs[j], prs[j+1]);

比较例程的签名是:

int cmpTwoPersons(struct person *a, struct person *b);

并将冒泡排序称为:

bubblesort(prs, n, cmpTwoPersons);

通过使用void *作为数据类型,您可以使冒泡排序算法与要排序的数据相关,并且比较函数说明如何比较两个元素。但是,要排序的数据必须是一个指针数组,因此气泡只需要交换指针而不是整个结构,因为它不知道它们的大小。