C语言,结构体快排

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言,结构体快排相关的知识,希望对你有一定的参考价值。

比如对于结构体
struct ln

int data;
int score;
int math;
ss[100];
根据ss[i].data的大小对整个结构体进行快排,即使用qsort函数进行排序。因为我使用冒泡法排序超时了,所以考虑一下看能不能用快排,可是不怎么会对结构体使用快排,谢谢各位了!!

自定义一个比较函数,直接调用快排库函数qsort即可。举例如下:

//#include "stdafx.h"//If the vc++6.0, with this line.
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
struct ln
  int data,score,math;
ss[100];
int mycmp(const void *a, const void *b)//自定义比较函数
    return ((struct ln*)a)->data-((struct ln*)b)->data;//若要降序,-号前后变量交换
//data改为score或math就可按相应要素排序
int main(void)//测试一下……
    int i;
    srand((unsigned)time(NULL));
    for(i=0;i<100;ss[i++].data=rand()%1000);
    qsort(ss,100,sizeof(struct ln),mycmp);
    for(i=0;i<100;printf("%4d",ss[i++].data));
    printf("\\n");
    return 0;

参考技术A 函数原型:
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );

先定义一个比较函数:
int compare(const void* pLeft, const void* pRight)

return ((ln*)pLeft)->data - ((ln*)pRight)->data;


然后
qsort(ss, 100, sizeof(ln), compare);
参考技术B int cmp(const void *p, const void *q);//声明函数
struct ln

int data;
int score;
int math;
ss[100];
int main()

qsort(ss, 100, sizeof(struct ln), cmp);//对结构体ss进行快排

int cmp(const void *p,const void *q)//该函数进行的是升序快排,如果想要进行降序快排,则将
//1和-1调换即可

int c= (*(struct ln*)p).data - (*(struct ln*)q).data;//根据结构体中data的值进行排序
if(c>0) return 1;
else return -1;
本回答被提问者和网友采纳

kruskal:最小生成树

luogu P3366 【模板】最小生成树

在连接各个点的所有路径中,选取最短的路径连接所有点

n个顶点,e条边,时间复杂度O(eloge)

kruskal主要思路:

  1. 输入边,用结构体储存

  2. 用结构体快排以边比较从小到大快排

  3. 建一个并查集,并初始化并查集(并查集代表两个点有没有在同一个树里面

  4. for(i=1;i<=m(边数);i++)找一条边,若其连接的两个点不在同一个并查集里面,就将两者所在的并查集合并,并将ans+=s[i].len。

  5. 若在同一个并查集,则跳过这次循环。因为如果这两个点连接起来,就会形成一个环。

  6. 直到边有n-1条

 

 

 

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct ll
{
    int x,y,len;
}s[200020];
bool cmp(ll a,ll b)
{
    return a.len<b.len;
}
int n,m,ans;
int fa[5050],big[5050];
int getfa(int x)
{
    if(fa[x]==x) return x;
    return fa[x]=getfa(fa[x]);
}
void gaibaba(int x,int y)
{
    int ba1=getfa(x),ba2=getfa(y);
    if(ba1==ba2) return;
    if(big[ba1]<big[ba2])
    {
        fa[ba1]=ba2;
        big[ba2]+=big[ba1];
    }
    else
    {
        fa[ba2]=ba1;
        big[ba1]+=big[ba2];
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].len);
        fa[s[i].x]=s[i].x;
        fa[s[i].y]=s[i].y;
    }
    int k=0;
    sort(s+1,s+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        if(getfa(s[i].x)!=getfa(s[i].y))
        {
            ans+=s[i].len;
            gaibaba(s[i].x,s[i].y );
            k++;
        }
        if(k==n-1)
        {
            printf("%d",ans);
            return 0;
        }
    }
    printf("orz");
    return 0;
}

 

以上是关于C语言,结构体快排的主要内容,如果未能解决你的问题,请参考以下文章

C语言 手册

kruskal:最小生成树

go语言的排序结构体排序

C语言结构体定义

c语言中返回结构体数组

c语言里面的结构体是啥意思