2

swap交换

#include <stdio.h>

void swap (int &a, int &b)
{
     int t;
     t = a;
     a = b;
     b = t;
}

int main()
{
     int x=5, y=3;
     swap (x, y);
     printf ("%d,%d",x,y);
     return 0;
}
#include <stdio.h>

void swap (int *ap, int *bp)
{
     int t;
     t = *ap;
     *ap = *bp;
     *bp = t;
}

int main()
{
     int a=5, b=3;
     swap (&a, &b);
     printf ("%d,%d",a,b);
     return 0;
}

万年历

#include <stdio.h>
int main()
{
      int monthdays[] = {
              31, 28, 31, 30,
              31, 30, 31, 31,
              30, 31, 30, 31
      };
      int year, month, days, weekday;
      int buf[42];

      scanf ( "%d-%d", &year,&month );
      if((year%4==0) && (year%100 || year%400==0)) monthdays[1]++;

      days = (year-1)*365 + year/4 - year/100 + year/400;
      for(int i=0; i<month-1; i++) days += monthdays[i];

      weekday = days%7;
      for(int i=0; i<42; i++) buf[i] = 0;
      for(int i=1,j=weekday; i<=monthdays[month-1]; i++,j++) buf[j] = i;
      printf("% 13d年%d月\n", year,month);
      printf("日  一 二 三  四 五 六 \n");
      for(int j=0; j<6; j++) {
          for(int i=0; i<7; i++)
              printf ( "%02d ", buf[j*7+i] );
          printf("\n");
      }
      return 0;
}

字符串比较

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

int strcmp (char *S1, char *S2)
{
    for (int i=0; (S1[i]&&S2[i])||(S1[i]!=S2[i]); i++)
    {
        if(S1[i]>S2[i])
        {
            return 1;
        }
        if(S1[i]<S2[i])
        {
            return -1;
        }
    }
    return 0;
}

/***********************************************************/
int main()
{
    char *S1="aaaa";
    char *S2="aaaaaaa";
    printf ("%d", strcmp ( S1, S2 ));
}

查找字符串中字符

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

int strchr (char *S, char c)
{
    for (int i=0; S[i]; i++)
    {
        if(S[i]==c)
        {
            return i;
        }
    }
    return -1;
}

/***********************************************************/
int main()
{
    char *S="xyz";
    char c='z';
    printf ("%d", strchr ( S, c ));
}

字符串比较加限制长度

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

int strcmp (char *S1, char *S2, int n)
{
    for (int i=0; ((S1[i]&&S2[i])||(S1[i]!=S2[i]))&&(i<n); i++)
    {
        if(S1[i]>S2[i])
        {
            return 1;
        }
        if(S1[i]<S2[i])
        {
            return -1;
        }
    }
    return 0;
}

/***********************************************************/
int main()
{
    char *S1 ="aaaa";
    char *S2 ="aaaaaaa";
    int n = 4;
    printf ("%d", strcmp ( S1, S2, n ));
}
#include <stdio.h>
#include <stdlib.h>

char *strncpy (char *S1, char *S2, int n)
{
    int i;
    for (i=0; S2[i] && i<n; i++)
    {
        S1[i] = S2[i];
    }
    S1[i] = '\0';
    return S1;
}

/***********************************************************/
int main()
{
    char *S2 = "abcde";
    char S1[6];
    printf ("%s", strncpy ( S1, S2, 4 ));
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int a[]={1,4,5,8,9};
    int alen = sizeof(a)/sizeof(a[0]);
    int b[]={2,3,6,7,10};
    int blen = sizeof(b)/sizeof(b[0]);
    int c[256];
    int clen = 0;
    int i=0, j=0;
    while(i<alen && j<blen) {
        c[clen++] = a[i]>b[j] ? b[j++] : a[i++];
    }
    while(i<alen) c[clen++] = a[i++];
    while(j<blen) c[clen++] = b[j++];
    for (int l=0; l<clen; l++) printf("%d ", c[l]);
    printf("\n");
}
#include <stdio.h>
#include <string.h>

int bsearch (char *a[], char *v, int begin, int end)
{
    for (int i=(begin+end+1)/2; i<end; i=i)
    {
        switch (strcmp (a[i], v)) 
        {
            case 1: end=i;
            case -1: begin=i;
            case 0: return i;
        }
    }
    return -1;
}
            
int main()
{
    char *s[] = {"abort", "broad", "count", "discount", "enough", "fire", "good", "hire", "inspect", "jump", "kick", "help"};
    printf("%d\n", bsearch(s, "fire", 0, 11));
}
#include <stdio.h>
#include <stdlib.h>

typedef int Data;

struct Node 
{
    Data    data;
    struct Node *left;
    struct Node *right;
};

typedef struct Node *PNode;

PNode createNode(Data data)
{
    PNode p = (PNode)malloc(sizeof(struct Node));
    if(!p)
    {
        printf("Out of memory!\n");
        exit(-1);
    }
    p->data = data;
    p->left = NULL;
    p->right = NULL;
    return p;
}

void appendNode(PNode &btree, Data data)
{
    if(!btree)
    {
        btree = createNode(data);
        return;
    }
    appendNode(data < btree->data ? btree->left : btree->right, data);
}
 
void preOrder(PNode btree, void (*func)(PNode))
{
    if(!btree)return;
    func(btree);
    preOrder(btree->left, func);
    preOrder(btree->right, func);
}

void inOrder(PNode btree, void (*func)(PNode))
{
    if(!btree) return;
    inOrder(btree->left,func);
    func(btree);
    inOrder(btree->right,func);
}

void postOrder(PNode btree, void (*func)(PNode))
{
    if(!btree) return;
    postOrder(btree->left, func);
    postOrder(btree->right, func);
    func(btree);
}

void freeNode(PNode btree)
{
    postOrder(btree, (void (*)(PNode))free);
}

/**********************************************************************/

void printNode(PNode p)
{
    if(!p) return;
    printf("%d ", p->data);
}

int main()
{
    Data a[]={8,7,15,30,2,4,6};
    int length = sizeof(a)/sizeof(a[0]);
    PNode btree = NULL;
    
    for(int i=0; i<length; i++)
    {
        appendNode(btree, a[i]);
    }
    
    inOrder(btree, printNode);
    printf("\n");
    
    freeNode(btree);
}
#include <stdio.h>

void w(int a[3], int v)
{
    a[2] = v%10; v/=10;
    a[1] = v%10; v/=10;
    a[0] = v;
}

int p(int a[9])
{
    int c[10]={1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    for (int i=0; i<9; i++)
    {
        if(c[a[i]]) return 0;
        c[a[i]] = 1;
    }
    return 1;
}

int main()
{
    int a[9];
    for (int i=123; i<=329; i++)
    {
        w(a, i);
        w(a+3, 2*i);
        w(a+6, 3*i);
        if(p(a)) printf ("%d %d %d\n", i, 2*i, 3*i);
    }
}
#include <stdio.h>
#include <stdlib.h>

unsigned long fibonacci(unsigned int n)
{
    switch(n) {
    case 0:
    case 1:
        return 1;
    default:
        return fibonacci(n-1)+fibonacci(n-2);
    }
}

int main()
{
    printf("%ld", fibonacci(42));
    return 0;
}
#include <stdio.h>
#include <stdlib.h>

unsigned long fibonacci(unsigned int n)
{
    static unsigned long F[100] = {1, 1};
    static int N = 2;
    while(n >= N) {
        F[N] = F[N-1]+F[N-2];
        N++;
    }
    return F[n];
}

int main()
{
    printf("%ld", fibonacci(82));
    return 0;
}
#include <stdio.h>
#include <stdlib.h>

void p(char x, int y)
{
    for (int i=0; i<y; i++)
    {
        printf("%c", x);
    }
}

int main()
{
    int n=21;
    for (int i=1; i<=n; i+=2)
    {
         p(' ', (n-i)/2);
         p('*', i);
         printf("\n");
    }
    return 0;
}
#include <stdio.h>
#include <stdlib.h>

int f(int x)
{
    int y=0;
    while(x)
    {
        int i=x%10;
        x/=10;
        y=y*10+i;
    }
    return y;
}

int main()
{
    int i=-1385;
    printf("%d",f(i));
    return 0;
}
#include <stdio.h>
#include <stdlib.h>

void out(int count, int limit) 
{
    printf(count >= limit ? " *" : "  ");
}

int main()
{
    int max = 0, count[26];
    for(int i=0; i<26; i++) count[i] = 0;

    char *s = "THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.THIS IS AN EXAMPLE TO TEST FOR YOURHISTOGRAM PROGRAM.HELLO!";
    for(int i=0; s[i]; i++)
    {
        if('A'<=s[i] && s[i]<='Z') 
        {
            if(++count[s[i]-'A']>max) max = count[s[i]-'A'];
        }
    }
    for(int limit=max; limit>0; limit--) 
    {
        for(int i=0; i<26; i++) out(count[i], limit);
        printf("\n");
    }
    for(int i='A'; i<='Z'; i++) printf(" %c", i);
    printf("\n");
}
#include <stdio.h>
#include <stdlib.h>
    
int max (int a, int b)
{
    return (a>b) ? a : b;
}
 
int min (int a, int b)
{
    return (a<b) ? a : b;
}

int add (int *a, int n)
{
    int sum = 0;
    for (int i=0; i<n; i++) sum += a[i];
    return sum;
}

int fajo(int *a, int n, int m)
{
    if(m==1) return add(a, n);
    int best = max(add(a, 1), fajo(a+1, n-1, m-1));
    for(int i=1; i<=n-m; i++) {
        int t = max(add(a, 1+i), fajo(a+1+i, n-1-i, m-1));
        best = min(best, t);
    }
    return best;
}

int main() {
    int n, m, a[100];
    scanf("%d %d\n", &n, &m);
    for(int i=0; i<n; i++) scanf("%d\n", &a[i]);
    printf("%d\n", fajo(a, n, m));
}
#include <stdio.h>

struct student {
    int k;
    int s;
};

int Partion(struct student *a, int left, int right) {
    struct student pivot = a[left];
    while(left < right) {
        while(left < right && a[right].s <= pivot.s) --right;
        if(left < right) a[left++] = a[right];
        while(left < right && a[left].s >= pivot.s) ++left;
        if(left < right) a[right--] = a[left];
    }
    a[left] = pivot;
    return left;
}

void QuickSort(struct student *a, int left, int right) {
    if(left < right) {
        int pivotpos = Partion(a, left, right);
        QuickSort(a, left, pivotpos-1);
        QuickSort(a, pivotpos+1, right);
    }
}

int main() {
    int n, m;
    struct student a[100];
    scanf("%d %d\n", &n, &m);
    for (int i=0; i<n; i++) scanf("%d %d\n", &a[i].k, &a[i].s);

    QuickSort( a, 0, n-1 );

    int c=(int)(m*1.5+0.5);
    printf("%d %d\n", a[c-1].s, c);
    for (int i=0; i<c; i++) printf("%d %d\n", a[i].k, a[i].s);
}
#include <stdio.h>
#include <stdlib.h>
    
int main() {
    int array[100][100], row, col;
    scanf("%d %d\n", &row, &col);
    for (int i=0; i<row; i++) {
        for (int j=0; j<col; j++) scanf("%d ", &array[i][j]);
        scanf("\n");
    }

    struct {
        int x;
        int y;
    } directs[4] = {
        {1,0}, {0,1}, {-1,0}, {0,-1}
    };
    int direct = 0;    
    int left=0, top=0, right=col-1, bottom=row-1;
    int x=0, y=0;
    printf("(%d, %d) = %d\n", x, y, array[y][x]);
    for (int i=0; i<row*col-1; i++) 
    {
        int u= x+directs[direct].x;
        int v= y+directs[direct].y;
        if(u<left || u>right || v<top || v>bottom) {
            switch(direct) {
            case 0: top++;    break;
            case 1: right--;  break;
            case 2: bottom--; break;
            case 3: left++;   break;
            }
            direct = (direct+1)%4;
            x += directs[direct].x;
            y += directs[direct].y;
        }
        else {
            x = u;
            y = v;
        }
        printf("(%d, %d) = %d\n", x, y, array[y][x]);
    }
}
#include <stdio.h>
#include <stdlib.h>
    
int main() {
    int array[100][100], row, col;
    scanf("%d %d\n", &row, &col);
    for (int i=0; i<row; i++) {
        for (int j=0; j<col; j++) scanf("%d ", &array[i][j]);
        scanf("\n");
    }

    int x=0, y=0;
    printf("(%d, %d) = %d\n", x, y, array[y][x]);
    for (int i=0; i<row*col-1; i++) {
        int u= x-1, v= y+1;
        if(u<0 || v>=row) {
            u= x+y+1;
            v= 0;
            if(u>=col) {
                v= u-(col-1);
                u= col-1;
            }
        }
        x= u, y= v;
        printf("(%d, %d) = %d\n", x, y, array[y][x]);
    }
}

数组排序颠倒

int a[10], b[10];
for (int i=0; i<10; i++) b[i] = a[9-i];
#include <stdio.h>
#include <stdlib.h>

void m(int hour, int minute, int second, int day, int month, int year)
{
    int monthdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if((year%4==0) && (year%100 || year%400==0)) monthdays[1]++;

    day += year*365 + year/4 - year/100 + year/400 + (year%100 ? 1 : 0);
    for(int i=0; i<month; i++) day += monthdays[i];
    
    int seconds = (int)(1.0*(hour*60*60+minute*60+second)/(24*60*60)*(10*100*100));
    int mhour = seconds/(100*100),
        mmin = seconds%(100*100)/100,
        msec = seconds%100,
        mday = day%100 + 1,
        mmonth = day%1000/100 + 1,
        myear = day/1000;
    printf("%d:%d:%d %d.%d.%d\n", mhour, mmin, msec, mday, mmonth, myear);
}

int main()
{
    int n;
    scanf("%d\n", &n);
    for(int i=0; i<n; i++) {
        int hour, minute, second, day, month, year;
        scanf("%d:%d:%d %d.%d.%d\n", &hour, &minute, &second, &day, &month, &year);
        m(hour, minute, second, day-1, month-1, year-2000);
    }
    return 0;
}

大整数乘法

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

int main() {
    char a[100];
    scanf("%s\n", a);
    int aSize = strlen(a);
    for(int j=0; j<aSize; j++) a[j] -= '0';
    char b[100];
    scanf("%s\n", b);
    int bSize = strlen(b);
    for(int i=0; i<bSize; i++) b[i] -= '0';

    int cSize = aSize+bSize;
    char c[cSize];

    for(int k=0; k<cSize; k++) c[k] = 0;
    for(int i=bSize-1; i>=0; i--) {
        for(int j=aSize-1; j>=0; j--) {
            int k = i+1+j;
            c[k] += a[j]*b[i];
            if(c[k] >= 10) {
                c[k-1] += c[k]/10;
                c[k] %= 10;
            }
        }
    }
    int k=0;
    while(c[k]==0) k++;
    while(k<cSize) printf("%d", c[k++]);
    printf("\n");
}
#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    scanf("%d\n", &n);
    struct {
        int v;
        int c;
    } a[n];
    for(int i=0; i<n; i++) {
        scanf("%d ", &a[i].v);
        a[i].c = 1;
    }

    for(int i=0; i<n-1; i++) {
        for(int j=i+1; j<n && a[j].v==a[i].v; j++) a[j].c++;
    }

    int k = a[0].c;
    for(int i=1; i<n; i++) {
        if(a[i].c>k) k = a[i].c;
        printf("%d ", a[i].c);
    }
    printf("%d\n", k);
}
#include <stdio.h>
#include <stdlib.h>

struct student {
    int m;
    float s;
};

int Partion(struct student *a, int left, int right) {
    struct student pivot = a[left];
    while(left < right) {
        while(left < right && a[right].s >= pivot.s) --right;
        if(left < right) a[left++] = a[right];
        while(left < right && a[left].s <= pivot.s) ++left;
        if(left < right) a[right--] = a[left];
    }
    a[left] = pivot;
    return left;
}

void QuickSort(struct student *a, int left, int right) {
    if(left < right) {
        int pivotpos = Partion(a, left, right);
        QuickSort(a, left, pivotpos-1);
        QuickSort(a, pivotpos+1, right);
    }
}

int main() {
    int n, k;
    scanf("%d %d\n", &n, &k);

    struct student a[n];
    for (int i=0; i<n; i++) scanf("%d %f\n", &a[i].m, &a[i].s);

    QuickSort( a, 0, n-1 );
    printf("%d %.1f\n", a[k-1].m, a[k-1].s);
}
#include <stdio.h>
#include <stdlib.h>

int PartionMin(int *a, int left, int right) {
    int pivot = a[left];
    while(left < right) {
        while(left < right && a[right] >= pivot) --right;
        if(left < right) a[left++] = a[right];
        while(left < right && a[left] <= pivot) ++left;
        if(left < right) a[right--] = a[left];
    }
    a[left] = pivot;
    return left;
}
/* 由小至大 */

int PartionMax(int *a, int left, int right) {
    int pivot = a[left];
    while(left < right) {
        while(left < right && a[right] <= pivot) --right;
        if(left < right) a[left++] = a[right];
        while(left < right && a[left] >= pivot) ++left;
        if(left < right) a[right--] = a[left];
    }
    a[left] = pivot;
    return left;
}

void QuickSortMin(int *a, int left, int right) {
    if(left < right) {
        int pivotpos = PartionMin(a, left, right);
        QuickSortMin(a, left, pivotpos-1);
        QuickSortMin(a, pivotpos+1, right);
    }
}

void QuickSortMax(int *a, int left, int right) {
    if(left < right) {
        int pivotpos = PartionMax(a, left, right);
        QuickSortMax(a, left, pivotpos-1);
        QuickSortMax(a, pivotpos+1, right);
    }
}

int main() {
    int n, i=0, j=0;
    int a[10], b[10];
    for(int m=0; m<10; m++)
    {
        scanf("%d ", &n);
        if(n%2) a[i++]=n;
        else b[j++]=n;
    }
    
    QuickSortMax( a, 0, i-1 );
    for(int m=0; m<i; m++) printf("%d ", a[m]);
    QuickSortMin( b, 0, j-1 );
    for(int m=0; m<j; m++) printf("%d ", b[m]);
}
#include <stdio.h>
#include <stdlib.h>

int Partion(int *a, int left, int right, int (*cmp)(int, int)) {
    int pivot = a[left];
    while(left < right) {
        while(left < right && cmp(a[right], pivot)>=0) --right;
        if(left < right) a[left++] = a[right];
        while(left < right && cmp(a[left], pivot)<=0) ++left;
        if(left < right) a[right--] = a[left];
    }
    a[left] = pivot;
    return left;
}

void QuickSort(int *a, int left, int right, int (*cmp)(int, int)) {
    if(left < right) {
        int pivotpos = Partion(a, left, right, cmp);
        QuickSort(a, left, pivotpos-1, cmp);
        QuickSort(a, pivotpos+1, right, cmp);
    }
}

int cmp(int u, int v) {
    switch(u%2*2+v%2) {
    case 0: return u-v;
    case 1: return 1;
    case 2: return -1;
    case 3: return v-u;
    }
}

int main() {
    int a[10];
    for(int m=0; m<10; m++) scanf("%d ", &a[m]);
    scanf("\n");
    QuickSort(a, 0, 9, cmp);
    for(int m=0; m<10; m++) printf("%d ", a[m]);
    printf("\n");
}

排列+二分法整数查找

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

int Partion(int *a, int left, int right) {
    int pivot = a[left];
    while(left < right) {
        while(left < right && a[right] >= pivot) --right;
        if(left < right) a[left++] = a[right];
        while(left < right && a[left] <= pivot) ++left;
        if(left < right) a[right--] = a[left];
    }
    a[left] = pivot;
    return left;
}

void QuickSort(int *a, int left, int right) {
    if(left < right) {
        int pivotpos = Partion(a, left, right);
        QuickSort(a, left, pivotpos-1);
        QuickSort(a, pivotpos+1, right);
    }
}

int bsearch(int *a, int begin, int end, int b)
{
    while(begin < end) {
        int i = (begin+end)/2;
        int f = a[i]-b;

        if(!f) return a[i];
        if(f < 0) begin = i+1;
        else      end   = i-1;
    }
    return a[begin];
}

int main() {
    int n;
    scanf("%d\n", &n);
    int a[n];
    for(int i=0; i<n; i++) scanf("%d ", &a[i]);
    scanf("\n");
    QuickSort( a, 0, n-1);

    int m;
    scanf("%d\n", &m);
    for(int i=0; i<m; i++) {
        int b;
        scanf("%d\n", &b);
        printf("%d\n", bsearch(a, 0, n-1, b));
    }
}
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    scanf("%d\n", &n);
/*
    int m;
    float sum=0;
    for(int i=0; i<n; i++)
    {
        scanf("%d\n", &m);
        while(m-70>=0)
        {
            sum++;
            m-=70;
        }
        sum++;
    }
    sum*=0.1;
    printf("%.1f\n", sum);
*/
    int sum=0;
    for(int i=0; i<n; i++)
    {
        int m;
        scanf("%d\n", &m);
        sum += m/70+1;
    }
    printf("%.1f\n", 0.1*sum);
}
#include <stdio.h>
#include <stdlib.h>

struct student {
    char m[32];
    int n;
};

int Partion(struct student *a, int left, int right, int (*cmp)(struct student, struct student)) {
    struct student pivot = a[left];
    while(left < right) {
        while(left < right && cmp(a[right], pivot)>=0) --right;
        if(left < right) a[left++] = a[right];
        while(left < right && cmp(a[left], pivot)<=0) ++left;
        if(left < right) a[right--] = a[left];
    }
    a[left] = pivot;
    return left;
}

void QuickSort(struct student *a, int left, int right, int (*cmp)(struct student, struct student)) {
    if(left < right) {
        int pivotpos = Partion(a, left, right, cmp);
        QuickSort(a, left, pivotpos-1, cmp);
        QuickSort(a, pivotpos+1, right, cmp);
    }
}

int cmp(struct student u, struct student v) {
    return v.n-u.n;
}

int main() {
    int n;
    scanf("%d\n", &n);

    struct student a[n];
    for (int i=0; i<n; i++) scanf("%s %d\n", a[i].m, &a[i].n);

    QuickSort(a, 0, n-1, cmp);
    for (int i=0; i<n; i++) printf("%s %d\n", a[i].m, a[i].n);
}

直接代入排序

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

void f(int *a, int n, int m)
{
    if(n<2) return;
    for(int i=1; i<n; i++) 
    {
        if(a[0]+a[i]==m) {
            printf("%d %d\n", a[0], a[i]);
            exit(0);
        }
    }
    f(a+1, n-1, m);
}

int cmp(int *u, int *v) {
    return *u - *v;
}

int main()
{
    int n;
    scanf("%d\n", &n);
    int a[n];
    for(int i=0; i<n; i++) scanf("%d ", a+i);
    scanf("\n");
    qsort(a, n, sizeof(int), (int (*)(const void *, const void *))cmp);
    int m;
    scanf("%d\n", &m);
    f(a, n, m);
}

归并排序

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

struct student
{
    char s[64];
    int n;
};
        
void Merge(struct student *a, int s, int m, int e, struct student *tmp)
{
    int pb=0;
    int p1=s, p2=m+1;
    while(p1 <= m && p2<= e)
    {
        if( a[p1].n > a[p2].n || (a[p1].n==a[p2].n && strcmp(a[p1].s, a[p2].s)<0) ) tmp[pb++] = a[p1++];
        else tmp[pb++] = a[p2++];
    }
    while( p1 <= m ) tmp[pb++] = a[p1++];
    while( p2 <= e ) tmp[pb++] = a[p2++];
    for( int i=0; i<e-s+1; i++ ) a[s+i] = tmp[i];
}

void MergeSort(struct student *a, int s, int e, struct student *tmp)
{
    if( s < e )
    {
        int m = (s+e)/2;
        MergeSort(a,s,m,tmp);
        MergeSort(a,m+1,e,tmp);
        Merge(a,s,m,e,tmp);
    }
}

int main()
{
    int n;
    scanf("%d\n", &n);
    
    struct student a[n];
    for(int i=0; i<n; i++) scanf("%s %d\n", a[i].s, &a[i].n);
    
    struct student tmp[n];
    MergeSort( a, 0, n-1, tmp);
    for(int i=0; i<n; i++) printf("%s %d\n", a[i].s, a[i].n);
    return 0;
}

快速排序

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

struct student {
    char m[64];
    int n;
};

int compare(struct student a, struct student b) {
    int c = b.n-a.n;
    if(c) return c;
    return strcmp(a.m, b.m);
}

int Partion(struct student *a, int left, int right) {
    struct student pivot = a[left];
    while(left < right) {
        while(left < right && compare(a[right], pivot) > 0) --right;
        if(left < right) a[left++] = a[right];
        while(left < right && compare(a[left], pivot) < 0) ++left;
        if(left < right) a[right--] = a[left];
    }
    a[left] = pivot;
    return left;
}

void QuickSort(struct student *a, int left, int right) {
    if(left < right) {
        int pivotpos = Partion(a, left, right);
        QuickSort(a, left, pivotpos-1);
        QuickSort(a, pivotpos+1, right);
    }
}

int main() {
    int n;
    scanf("%d\n", &n);

    struct student a[n];
    for (int i=0; i<n; i++) scanf("%s %d\n", a[i].m, &a[i].n);

    QuickSort(a, 0, n-1);
    for (int i=0; i<n; i++) printf("%s %d\n", a[i].m, a[i].n);
    return 0;
}

k搜索

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

void Merge(int *a, int s, int m, int e, int *tmp)
{
    int pb=0;
    int p1=s, p2=m+1;
    while(p1 <= m && p2 <= e)
    {
        if(a[p1] > a[p2]) tmp[pb++] = a[p1++];
        else tmp[pb++] = a[p2++];
    }
    while( p1 <= m ) tmp[pb++] = a[p1++];
    while( p2 <= e ) tmp[pb++] = a[p2++];
    for(int i=0; i<e-s+1; i++) a[s+i] = tmp[i];
}

void MergeSort(int *a, int s, int e, int *tmp)
{
    if( s < e )
    {
        int m = (s+e)/2;
        MergeSort(a,s,m,tmp);
        MergeSort(a,m+1,e,tmp);
        Merge(a,s,m,e,tmp);
    }
}

int main()
{
    int n;
    scanf("%d\n", &n);
    int a[n];
    for(int i=0; i<n; i++) scanf("%d ", &a[i]);
    scanf("\n");
    int k;
    scanf("%d\n", &k);
    
    int tmp[n];
    MergeSort(a, 0, n-1, tmp);
    
    for(int i=0; i<k; i++) printf("%d\n", a[i]);
    return 0;
}

萧雅
7 声望0 粉丝