class QuanPaiLie:
string=[]
stlen=0
def start(self,string):
self.string=list(sorted(string))
print(''.join(self.string))
self.stlen=len(self.string)
idx = self.get_idx()
midx = self.get_min(idx)
while midx >= 0:
self.swap(idx, midx)
self.reverse(idx + 1, len(self.string) - 1)
idx = self.get_idx()
midx = self.get_min(idx)
print(''.join(self.string))
def get_idx(self):
idx = self.stlen - 2
while idx > 0 and self.string[idx] >= self.string[idx + 1]:
idx -= 1
if idx>=0:
return idx
else:
return -1
def get_min(self,idx):
tmpmin = self.string[idx + 1]
if self.string[idx+1]>self.string[idx]:
midx = idx + 1
else:
midx=-1
for i in range(idx+1,len(self.string)):
if self.string[i]>self.string[idx] and self.string[i]<tmpmin:
tmpmin = self.string[i]
midx=i
return midx
def swap(self,i,j):
tmp=self.string[i]
self.string[i]=self.string[j]
self.string[j]=tmp
def reverse(self,startidx=0,endidx=None):
if endidx is None:
endidx=len(self.string)-1
if startidx>=endidx:
return
strlen=endidx-startidx+1
center=strlen//2
for i in range(center):
tmp=self.string[endidx-i]
self.string[endidx - i]=self.string[startidx+i]
self.string[startidx+i]=tmp
测试:
print('汉字:')
qpl.start('你好么')
print('\n数字:')
qpl.start('123')
print('\n字母:')
qpl.start('abc')
结果输出:
汉字: 么你好 么好你 你么好 你好么 好么你 好你么 数字: 123 132 213 231 312 321 字母: abc acb bac bca cab cba


