发现快排的内部还可以多抽象一重递归:找到一个需要交换的位置来和哨兵交换(正向找和反向找不停切换)。
static void Sort<T>(IList<T> v, int l, int r) where T : IComparable<T>
{
int i = l, j = r;
Swap(v, ref i, ref j, v[l]);
if (l < i - 1) Sort(v, l, i - 1);
if (i + 1 < r) Sort(v, i + 1, r);
}
static void Swap<T>(IList<T> v, ref int s, ref int p, T key, int dir = 1) where T : IComparable<T>
{
while (v[p].CompareTo(key) == dir || v[p].CompareTo(key) == 0)
if ((p = p - dir) == s) { v[p] = key; return; }
v.Swap(s, p);//交换哨兵和待调整值
Swap(v, ref p, ref s, key, -dir);
}
此实现方式仅适合教学探讨。实用最好改成迭代版本。 有人能改出来麻烦回帖:)