排字典顺序排序(c语言)

输入下述8个国家名字的字符串:CHINA、JAPAN、KOREA、INDIA、CANADA、AMERICAN、ENGLAND和FRANCE,将这些国名按字典顺序排序。

 

 

#include

#include

 

void main()

{

       charstr[8][9]={"CHINA","JAPAN","KOREA","INDIA","CANADA","AMERICAN","ENGLAND","FRANCE"};

       chartemp[9];

       inti,l;

    for (i=0;i<8;i++)

       {

              for(l=0;l<9;l++)

              {

                     printf("%c",str[i][l]);

              }

              printf("\n");

       }

       //排序

       printf("以上8个国家按字典中排序如下所示:\n");

       intj,k;

       for(j=0;j<8;j++)

       for(k=j+1;k<8;k++)

       {

                     if(strcmp(str[j],str[k])>0)

                     {//交换

                            strcpy(temp,str[j]);

                            strcpy(str[j],str[k]);

                            strcpy(str[k],temp); 

                     }

       }

              for(i=0;i<8;i++)//输出

                     printf("%s\n",str[i]);

}

 

1.字典序法
  字典序法中,对于数字123......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列1235412345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是54321
  字典序算法如下:
  设P1n的一个全排列:p=p1p2......pn=p1p2......pj-1pjpj+1......pk-1pkpk+1......pn
1)从排列的右端开始,找出第一个比右边数字小的数字的序号jj从左端开始计算),即
j=max{i|pi2)在pj的右边的数字中,找出所有比pj大的数中最小的数字pk,即k=max{i|pi>pj}(右边的数从右至左是递增的,因此k是所有大于pj的数字中序号最大者)

3)对换pipk
4)再将pj+1......pk-1pkpk+1pn倒转得到排列p’’=p1p2.....pj-1pjpn.....pk+1pkpk-1.....pj+1,这就是排列p的下一个下一个排列。

  例如839647521是数字19的一个排列。从它生成下一个排列的步骤如下:
  自右至左找出排列中第一个比右边数字小的数字4839647521
  在该数字后的数字中找出比4大的数中最小的一个
5839647521
  将54交换
839657421
  将7421倒转
839651247
  所以839647521的下一个排列是839651247

 

 

 

你可能感兴趣的:(编程,c语言)