Lua, 231231 220 bytes
s=...t={}s:gsub(".",functionload(c)table'table.insert(t,string(...):byte(c))endu=s.sub'))table.sort(t)for i=#t,1,-1 do a=t[i]%#t+1 i,j=math.min(a,i),math.max(a,i)s=s:subs=u(s,1,i-1)..s:subu(s,j,j)..s:subu(s,i+1,j-1)..(i~=j and s:subu(s,i,i)..s:subu(s,j+1)or"")end print(s)