安定なソート のコメント:
添え字配列作って、比較を(上と同じ様に)2段階にしたものを作り、
添え字で取り出せばいい・・・
単純にできると思うのですが、オブジェクト指向じゃないからダメですかー?
アリですねぇ、ええ、アリアリです。
んでは早速:
using System;
// 添え字による間接比較
struct IndexedCompare<T> {
public static T[] data;
public static Comparison<T> compare;
// 比較結果が0(等値)のときは添え字を比較する
public static int Comparison(int x, int y) {
int result = compare(data[x],data[y]);
if ( result == 0 ) result = x - y;
return result;
}
}
public class Program {
// 安定なソート
static public void StableSort<T>(T[] array, Comparison<T> comp) {
int[] index = new int[array.Length];
T[] clone = (T[])array.Clone();
IndexedCompare<T>.compare = comp;
IndexedCompare<T>.data = clone;
for ( int i = 0; i < index.Length; ++i ) {
index[i] = i;
}
Array.Sort(index,IndexedCompare<T>.Comparison);
for ( int i = 0; i < index.Length; ++i ) {
array[i] = clone[index[i]];
}
}
public static void Main() {
string[] master = {
"0", "00", "000", "0000", "00000",
"1", "11", "111", "1111", "11111",
"2", "22", "222", "2222", "22222",
"3", "33", "333", "3333", "33333",
};
string[] data;
data = (string[])master.Clone();
Array.Sort(data,delegate (string x, string y) { return x.Length - y.Length;});
Console.WriteLine("Array.Sort");
foreach ( string item in data ) Console.WriteLine(item);
data = (string[])master.Clone();
StableSort(data,delegate (string x, string y) { return x.Length - y.Length;});
Console.WriteLine("StableSort");
foreach ( string item in data ) Console.WriteLine(item);
}
}