订购2D char数组中的列

时间:2012-01-31 15:45:59

标签: c arrays matrix c99

我有一个2D数组,其中顶行是一行字母(字母),而底行是字母上方字母出现的频率。我们的想法是沿着顶行按频率顺序放置字母。

目前:

输入:

quickbrownfoxjumpsoverthelazydog

输出:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

11112111111111411211211111

期望的输出:

oeruabcdfghijklmnpqstvwxyz

42221111111111111111111111

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

main()
{
    char string[100];
    char s[26][2];
    int c = 0, count[26] = {0};

    printf("Enter a string\n");
    gets(string);

    while ( string[c] != '\0' )
    {
        if ( string[c] >= 'a' && string[c] <= 'z' ) 
        count[string[c]-'a']++;

        c++;
    }


    for ( c = 0 ; c < 26 ; c++ )
    {
        if( count[c] != 0 )
        {
            s[c][1]=c+'a';
            s[c][2]= (char)(((int)'0')+count[c]);
            gotoxy(c,1);
            printf("%c",s[c][1]);
            gotoxy(c,2);
            printf("%c",s[c][2]);
        }
    }

    return 0;
}

3 个答案:

答案 0 :(得分:1)

你应该找到每个iteraton的最大值。您可以使用一些快速排序算法,但一个简单的解决方案是:

for (c=0;c<26;c++) {
 int max=-1,letter,i;
 for (i=0;i<26;i++)
  if (count[i]>max) {
   max=count[i];
   letter=i;
  }
 count[letter]=-1;
 gotoxy(c,1);
 s[c][0]='a'+letter;
 printf("%c",s[c][0]);
 gotoxy(c,2);
 s[c][1]='0'+max;
 printf("%c",s[c][1]);
}

(当然,假设max <10)

答案 1 :(得分:1)

这是一种方法:取每个计数,将其向左移五,然后按位或低五位中的字母数。对结果数字进行排序,然后通过0x1F并添加'a'将其最不重要的五位转换回字母。

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

int compare (const void * a, const void * b) {
    int ia = *(int*)a;
    int ib = *(int*)b;
    return (ia>>5) == (ib>>5) ? ia-ib : ib-ia;
}

int main(int argc, char* argv[]) {
    char string[100] = "quickbrownfoxjumpsoverthelazydog";
    int c = 0, count[26];
    memset(count, 0, sizeof(count));
    while ( string[c] != '\0' ) {
        if ( string[c] >= 'a' && string[c] <= 'z' ) {
            count[string[c]-'a']++;
        }
        c++;
    }
            // Shift the letter ordinal into the lower five bits of the count*32
    for ( c = 0 ; c < 26 ; c++ ) {
        count[c] = (count[c] << 5) | c;
    }
            // Sort the results using the custom compare function
    qsort(count, 26, sizeof(int), compare);
            // Print the letters by taking the lower five bits
    for ( c = 0 ; c < 26 ; c++ ) {
        printf("%c", 'a'+(count[c]&0x1F));
    }
    printf("\n");
            // Print the counts by ignoring the lower five bits
    for ( c = 0 ; c < 26 ; c++ ) {
        printf("%d", count[c] >> 5);
    }
    return 0;
}

答案 2 :(得分:1)

有几件事:

  1. C中的数组是零源的,也就是说你的索引应该是s[c][0]s[c][1] - 你的代码没有崩溃b / c你很幸运。
  2. 通常,数组将以相反的方式排序:c[2][26]
  3. 关于排序...因为我们只使用了26个元素而不是260万个元素,所以如何以及何时使用它并不重要。你可以做一个泡泡排序。你可以想象并构建一些双向链表并按照你的方式对它进行排序,改变元素。玩得开心!