public static void Main()
var inputs = new []{"a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11"};
Console.WriteLine("Default Sorting:");
foreach(var x in inputs.OrderBy(y => y)){
Console.WriteLine("-----------");
Console.WriteLine("Crazy Sorting:");
foreach(var x in inputs.OrderBy(y => Naturalize(y))){
public static string Naturalize(string str)
if (string.IsNullOrEmpty(str))
const int maxLength = 450;
const int padLength = 15;
var sb = new StringBuilder();
for (var i = 0; i < str.Length; i++)
if (c >= '0' && c <= '9')
sb.Append(pad(str.Substring(numStart, numLength), isDecimal, padLength));
if (c != ' ' || !wasSpace)
if (sb.Length > maxLength)
sb.Append(pad(str.Substring(numStart, numLength), isDecimal, padLength));
if (sb.Length > maxLength)
private static string pad(string num, bool isDecimal, int padLength)
return isDecimal ? num.PadRight(padLength, '0') : num.PadLeft(padLength, '0');