document.write('
这道题本质上还是考察对字符串排序的理解,唯一不同的是,改变了比较字符串大小的规则,因此
这道题的关键是如何利用给定的规则比较两个字符串的大小,只要实现了两个字符串的比较,那么
利用任何一种排序方法都可以。下面重点介绍字符串比较的方法。
 本题的主要思路为:为给定的字母序列建立一个可以进行大小比较的序列,在这里我们采用map
数据结构来实现map的键为给定的字母序列,其值为从0开始依次递增的整数,对于没在字母序列
中的字母,对应的值统一按-1来处理。这样在比较字符串中的字符时,不是直接比较字符的大小,
而是比较字符在map中对应的整数值的大小。以“bed”、“dog”为例,[d,g,e,c,f,b,o,a]构建的
map为char_to_int[\'d\']=0, char_to_int[\'g\']=1, char_to_int[\'e\']=2,char_to_int[\'c\']=3,
char_to_int[\'f"]=4, char_to_int[\'b\']=5, char_to_int[\'o\']=6, char_to_int[\'a\']=7。在比
较“bed”与“dog”的时候,由于char_to_int[\'b\']=5, char_to_int[\'d\']=0,显然5>0,因
此,\'b\'>\'d\',所以,"bed">"dog"。
 下面以插入排序为例,给出实现代码:
 #根据char_to_int规定的字符的大小关系比较两个字符的大小
 def compare(str1,str2,char_to_int):
 len1=len(str1)
 len2=len(str2)
 i=0
 j=0
 while i<len1 and j<len2:
 #如果字符不在给定的序列中, 那么把值赋为-1
 if list(str1)[i] not in char_to_int.keys():
 char_to_int[list(str1)[i]]=-1
 if list(str2)[j] not in char_to_int.keys():
 char_to_int[list(str2)[j]]=-1
 #比较各个字符的大小
 if char_to_int[list(str1)[i]]<char_to_int[list(str2)[j]]:
 return -1
 elif char_to_int[list(str1)[i]]>char_to_int[list(str2)[j]]:
 return 1
 else:
 i+=1
 j+=1
 if i==len1 and j ==len2:
 return 0
 elif i==len1:
 return -1
 else:
 return 1
 
 def insertSort(s,char_to_int):
 #对字符串数组进行排序
 lens=len(s)
 i=1
 while i<lens:
 temp=s[i]
 j=i-1
 while j>=0:
 #用给定的规则比较字符串的大小
 if compare(temp,s[j],char_to_int)==-1:
 s[j+1]=s[j]
 else:
 break
 j-=1
 s[j+1]=temp
 i+=1
 
 if __name__="__main__":
 s=["bed","dog","dear","eye"]
 sequence="dgecfboa"
 lens=len(sequence)
 #用来存储字母序列与其对应的值的键值对
 char_to_int=dict()
 #根据给定字符序列构造字典
 i=0
 while i<lens:
 char_to_int[list(sequence)[i]]=i
 i+=1
 insertSort(s,char_to_int)
 i=0
 while i<len(s):
 print s[i],
 i+=1
 程序的运行结果为:
 dear dog eye bed
 算法性能分析:
 这种方法的时间复杂度为O(N3
)(其中N为字符串的长度)。因为insertSort函数中使用了双重遍
历,而这个函数中调用了compare函数,所以这个函数内部也有一层循环。

 

');