结构体快排(两个参数)(三个参数)

两个参数:

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

#define N 10000

struct node
{
    int a;
    int b;
    int x;

}st[N];

void kp(struct node st[], int l, int r)
{
    int i = l;
    int j = r;
    struct node k = st[l];
    if(l>=r) return;
    while(i<j)
    {
        while(i<j && st[j].a>=k.a)
        {
            if(st[j].a==k.a )
            {
                if(st[j].b>=k.b)
                j--;
                else
                    break;
            }
            else
            j--;
        }
        st[i] = st[j];

        while(i<j && st[i].a<=k.a)
        {
            if(st[i].a==k.a)
            {
                if(st[i].b<=k.b)
                    i++;
            }
            else
            {
                i++;
            }
        }
        st[j] = st[i];
    }
        st[i] = k;
        kp(st, i+1, r);
        kp(st, l, i-1);
}

int main()
{
    int m, n, t, i;
    while(~scanf("%d%d%d", &m, &n, &t))
    {
        for(i=0; i<t; i++)
        {
            scanf("%d%d%d", &st[i].b, &st[i].a, &st[i].x);
        }
        kp(st, 0, t-1);
        for(i=0; i<t; i++)
        {
            printf("%d %d %d\n", st[i].a, st[i].b, st[i].x);
        }
    }
    return 0;
}

三个参数:

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

#define N 500000+5

struct node
{
    int u;
    int v;
    int w;
}map[N];

void kp(struct node map[], int l, int r)
{
    int i = l, j = r;
    struct node k = map[l];
    if(l>=r) return ;
    while(i<j)
    {
        while(i<j && map[j].w>=k.w)
        {
            if(map[j].w == k.w)
            {
                if(map[j].u >= k.u)
                {
                    if(map[j].u==k.u)
                    {
                        if(map[j].v >= k.v)
                        {
                            j--;
                        }
                        else break;
                    }
                    else j--;
                }
                else break;
            }
            else j--;
        }
        map[i] = map[j];
        while(i<j && map[i].w<=k.w)
        {
            if(map[i].w == k.w)
            {
                if(map[i].u <= k.u)
                {
                    if(map[i].u==k.u)
                    {
                        if(map[i].v <= k.v)
                        {
                            i++;
                        }
                        else break;
                    }
                    else i++;
                }
                else break;
            }
            else i++;
        }
        map[j] = map[i];
    }
    map[i] = k;
    kp(map, i+1, r);
    kp(map, l, i-1);
}

int main()
{
    int n, m, u, v, w, q, x, a, i;
    struct node *p;
    while(~scanf("%d%d", &n, &m))
    {
        for(i=0; i<m; i++)
        {
            scanf("%d%d%d", &map[i].u, &map[i].v, &map[i].w);
        }
        scanf("%d", &x);
        kp(map, 0, m-1);
        while(x--)
        {
           scanf("%d", &a);
            printf("%d %d\n", map[a].u, map[a].v);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42137874/article/details/81359609
今日推荐