稳定的快排
if (s >= e) return s; int b[7]; int pa1, pa2, pb1, pb2; pa1 = pb1 = s; pa2 = pb2 = e; int start = s, end = e; int key = a[s]; for (int i = s + 1; i <= e;i++) if (a[i] >= key)b[pb1++] = a[i]; for (int i = e; i > s; i--) if (a[i] < key)b[pb2--] = a[i]; for (int i = pb2 + 1; i <= e; i++) a[start++] = b[i]; int idx = start ; a[start++] = key; for (int i = s; i < pb1; i++) a[start++] = b[i]; return idx;
要实现稳定的快排必须使用额外的空间,每次扫两次数组,把大于key和小于key的放在额外数组两侧,然后拷贝到原数组中。