我写个扑克牌的排序算法,牌的数量从多到少,牌得大小按从大到小,比如最后排列成: 99997777JJJ666KK88Q573

解决方案 »

  1.   

    LZ要的不是单纯的1单位的排序其中包含了 组合牌的排序
    比如333332222KKKKJJJQ54
      

  2.   

    可以先冒泡排序。3|5|666|7777|88|9999|JJJ|Q|KK。 排好后分组,一样大小的都放在一组。用结构体定义。
    struct
    {
      int number; //用来存数值大小
      int count; //用来存同样数字的个数
      char* str; //存字符串
    }然后只要先根据count排序一次,然后根据number二次排序。最后把所有字符串拼起来应该就可以了吧。这只是个想法不一定对。
      

  3.   

    想了一下,前面的方法太笨不好。试着写了下面的。应该好多了。#include <string>
    using namespace std;void Sort(const char* str, char* result)
    {
    int buffer[13] = {0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e};
    for (int i = 0; str[i]!= 0; i++)

    switch(str[i])
    {
    case '2': 
    buffer[0]+= 0x10; break;
    case '3': 
    buffer[1]+= 0x10; break;
    case '4': 
    buffer[2]+= 0x10; break;
    case '5': 
    buffer[3]+= 0x10; break;
    case '6': 
    buffer[4]+= 0x10; break;
    case '7': 
    buffer[5]+= 0x10; break;
    case '8': 
    buffer[6]+= 0x10; break;
    case '9': 
    buffer[7]+= 0x10; break;
    case '1': 
    buffer[8]+= 0x10; i++; break;
    case 'J': 
    buffer[9]+= 0x10; break;
    case 'Q': 
    buffer[10]+= 0x10; break;
    case 'K': 
    buffer[11]+= 0x10; break;
    case 'A': 
    buffer[12]+= 0x10; break;
    }
    } int i,j,temp; 
    bool done=false; 
    j=1; 
    while((j<13)&&(!done)) 

    done=true; 
    for(i=0;i<13-j;i++) 

    if(buffer[i]>buffer[i+1]) 

    done=false; 
    temp=buffer[i]; 
    buffer[i]=buffer[i+1]; 
    buffer[i+1]=temp; 


    j++; 
    } const char* Output[15] = {"", "", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"}; result[0]=0;
    for(i = 13; i > 0; i--)
    {
    while (buffer[i] > 0x10)
    {
    strcat(result,Output[buffer[i]&0x0f]);
    buffer[i] -= 0x10;
    }
    }}
    int _tmain(int argc, _TCHAR* argv[])
    {
    char str[] = "99779771053JJ696J6KK88Q";
    char result[256];
    Sort(str, result);
    printf("%s\n",result);
    return 0;
    }