#!/usr/bin/env python # -*- coding: utf-8 -*- #tri des caractères utilisés dans une chaîne def simple_kark_sort(s): n = len(s) s += (chr(1) * 3) SA = [0 for _ in s] alpha = sorted(set(s)) kark_sort(s, SA, n, alpha) return SA[:-3] def kark_sort(s, SA, n, alpha) : n0 = (n+2)//3 n1 = (n+1)//3 n2 = n//3 n02 = n0 + n2 SA12 = [0]*(n02+3) SA0 = [0]*n0 s12 = [] ## begin modification (from : htmllist)## # max = n + n0 - n1 # for i in range(max) : # if i % 3 != 0: # s12.append(i) s12 = [i for i in range(n + n0 - n1) if i % 3 != 0] ##end moditication s12.extend([0,0,0]) # s_2 = s[2:] # sx = iter(s) # sx.next().next() radixpass(s12, SA12, s[2:], n02, alpha) radixpass(SA12, s12, s[1:], n02, alpha) radixpass(s12, SA12, s, n02, alpha) name = 0 c0, c1, c2 = -1, -1, -1 array_name = [0] for i in range(n02) : if s[SA12[i]] != c0 or s[SA12[i]+1] != c1 or s[SA12[i]+2] != c2 : name += 1 array_name.append(name) c0 = s[SA12[i]] c1 = s[SA12[i]+1] c2 = s[SA12[i]+2] if SA12[i] % 3 == 1 : s12[SA12[i]//3] = name else : s12[SA12[i]//3 + n0] = name if name < n02 : kark_sort(s12, SA12, n02, array_name) for i in range(n02) : s12[SA12[i]] = i+1 else : for i in range(n02) : SA12[s12[i]-1] = i s0 = [SA12[i]*3 for i in range(n02) if SA12[i]