全排序之字典排序

字典序全排列算法研究

一. 非递归算法(字典序法)

对给定的字符集中的字符规定了一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后。

例如:字符集{1,2,3},较小的数字位置较先,这样按字典序生成的全排列是

123,132,213,231,312,321

※ 一个全排列可看做一个字符串,字符串可有前缀、后缀。

  生成给定全排列的下一个排列.所谓一个的下一个就是这一个与下一个之间没有其他的。这就要求这一个与下一个有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。

对于按字典的顺序给出的排列,由一个排列生成下一个排列的算法如下:

【例】 一般而言,设P是[1,n]的一个全排列。
      P=P1P2…Pn=P1P2…Pj-1PjPj+1…Pk-1PkPk+1…Pn
    find:  j=max{i|Pi<Pi+1}
         k=max{i|Pi>Pj}
      1,  对换Pj,Pk,
      2,  将Pj+1…Pk-1PjPk+1…Pn翻转
          P’= P1P2…Pj-1PkPn…Pk+1PjPk-1…Pj+1即P的下一个

【例】 如何得到346987521的下一个
    1,从尾部往前找第一个P(i-1) < P(i)的位置
            3 4 6 <- 9 <- 8 <- 7 <- 5 <- 2 <- 1
        最终找到6是第一个变小的数字,记录下6的位置i-1
    2,从i位置往后找到最后一个大于6的数
            3 4 6 -> 9 -> 8 -> 7 5 2 1
        最终找到7的位置,记录位置为m
    3,交换位置i-1和m的值
            3 4 7 9 8 6 5 2 1
    4,倒序i位置后的所有数据
            3 4 7 1 2 5 6 8 9
    则347125689为346987521的下一个排列

代码:用C++实现将以下国家按字典序排列

#include<stdio.h>
#include<string.h>
int main()
{
       char str[8][9]={"CHINA","JAPAN","KOREA","INDIA","CANADA","AMERICAN","ENGLAND","FRANCE"};
       char temp[9];
       int i,l;
    for (i=0;i<8;i++){
       for(l=0;l<9;l++){
              printf("%c",str[i][l]);
                      }
                      printf("\n");
                      }
     //排序
           printf("以上8个国家按字典中排序如下所示:\n");
            int j,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]);

}

【算法】:排列的字典序问题

Time Limit:2000MS  Memory Limit:65536K

Total Submit:69 Accepted:13

Description

n个元素{1,2,..., n }有n!个不同的排列。将这n!个排列按字典序排列,并编号为0,1,…,n!-1。每个排列的编号为其字典序值。例如,当n=3时,6 个不同排列的字典序值如下:

任务:给定n 以及n 个元素{1,2,..., n }的一个排列,计算出这个排列的字典序值,以及按字典序排列的下一个排列。

Input

第1 行是元素个数n(n < 15)。接下来的1 行是n个元素{1,2,..., n }的一个排列。

Output

第一行是字典序值,第2行是按字典序排列的下一个排列。

Sample Input

8

2 6 4 5 8 1 7 3

Sample Output

8227

2 6 4 5 8 3 1 7

代码后补!

全排序之字典排序

时间: 2024-11-05 23:34:22

全排序之字典排序的相关文章

python中列表排序,字典排序,列表中的字典排序

#-*- encoding=utf-8 -*- import operator #按字典值排序(默认为升序) x = {1:2, 3:4, 4:3, 2:1, 0:0} sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1)) print sorted_x #[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)] #如果要降序排序,可以指定reverse=True sorted_x = sorted(x.i

字符串排序(非字典排序)

2015.3.11 今天阿里面试,最后给我出了一个算法题,如下: 一个数组字符串,对其中的字符串进行排序,排序规则如下:长度越小越排在前面,长度相同则按照字符串大小排序.举个例子:“a”,"ab","Ab","b","abc",排序后 : a, b, Ab, ab, abc. 和室友讨论一下,由他想出了如下的方法:按照字符串的每一位进行排序,提前结束的字符串在相应位比较时总是最小.完成后,得到的结果也便是我们想要的了. 具体代

&lt;转&gt;python字典排序 关于sort()、reversed()、sorted()

一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a','have','I'])) #['I', 'have', 'a', 'dream'] 2.让人糊涂的sort()与sorted() 在Python 中sorted是内建函数(BIF),而sort()是列表类型的内建函数list.sort(). sorted() sorted(iterable[,

python 字典排序 关于sort()、reversed()、sorted()

一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a','have','I'])) #['I', 'have', 'a', 'dream'] 2.让人糊涂的sort()与sorted() 在Python 中sorted是内建函数(BIF),而sort()是列表类型的内建函数list.sort(). sorted() sorted(iterable[,

按照字典排序

按照字典排序, 按照字典的value排序,类似sort -k命令 import operator x = {1:2,3:4, 4:3, 2:1, 0:0} sorted x =sorted(x.iteritems(), key = operator.itemgetter(1)) 0表示根据key排序,1表示根据value排序 In [33]: sorted(x.iteritems(),key=operator.itemgetter(0))                             

字典排序及应用

字典排序: 因为我们都知道字典是无序的,所以也没有想过字典怎么排序,直到--唉 废话不多说,先看按值.按键排序的方法吧. 有一个字典dic1 = {'tired': 1, 'car': 2, 'man': 2, 'of': 1, 'front': 1, 'who': 2, 'in': 1, 'run': 2, 'exhausted': 1, 'get': 2, 'behind': 1} 按值排序:dic2 = sorted(dic1.items(),key=lambda d:d[1],rever

2016.7.30 正则表达式 字典排序

正则表达式:我要匹配字符串中两个引号中的内容 例如 str = '  map.put("abdicate","v.正式放弃(权力.责任):throne"); ' 匹配后要获得 abdicate 以及 v.正式放弃(权力.责任):throne 即引号中的红色内容 正则表达式为\"([^\"]*)\" :[^\"]是指除了"以外的字符 这样就成功得到了需要的内容.注意findall函数的使用 字典排序: key=lamb

C# 字典排序Array.Sort

Array.Sort可以实现便捷的字典排序,但如果完全相信他,那么就容易产生些异常!太顺利了,往往是前面有坑等你. 比如:微信接口,好多地方需要签名认证,签名的时候需要用的字典排序,如果只用Array.Sort()会出现签名异常的情况,而且是偶尔出现. 问题就在于他的排序默认没有区分大小写,这跟微信的签名将不匹配,所以还是需要自己实现比较的方法 public class DictionarySort : System.Collections.IComparer { public int Comp

华为OJ—火车进站(栈,字典排序)

给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号.其实也就是输出所有可能的出栈序列. 样例输入: 3 1 2 3 样例输出: 1 2 31 3 22 1 32 3 13 2 1 解答: 其实核心就是一个栈,对于第K个数,在第K个数进栈之前,前面的 K-1 个数要么全部出去了,要么都在栈里面,要么部分在栈里面部分出去了.那么可以假想,在第K个数入栈之前,依次从栈里面出去 0个.1个.2个--栈.si