这看起来像家庭作业,所以我不打算完全解决它:
通过确保没有2个元素相等,可以使快速排序稳定.
单独选择不同的枢轴并不能为此提供解决方案.
既然你说这不是作业,这里是如何使快速排序稳定:
创建一个指向原始数组的指针数组.
使用quick-sort对这个数组进行排序,该函数用这种方式比较指向的值:
int sortptr(const void *a, const void *b) { const my_type * const *pa = a; const my_type * const *pb = b; int cmp = original_compare_function(*pa, *pb); return cmp ? cmp : (pa > pb) - (pa < pb); }
将已排序的项目复制到已排序的数组中.
请注意,这种方法可以在适当的位置工作,但这样做很棘手,并且仍然需要分配指针数组.merge-sort对于稳定排序更加可靠,但需要大约原始数组大小一半的工作空间.
这看起来像家庭作业,所以我不打算完全解决它:
通过确保没有2个元素相等,可以使快速排序稳定.
单独选择不同的枢轴并不能为此提供解决方案.
既然你说这不是作业,这里是如何使快速排序稳定:
创建一个指向原始数组的指针数组.
使用quick-sort对这个数组进行排序,该函数用这种方式比较指向的值:
int sortptr(const void *a, const void *b) { const my_type * const *pa = a; const my_type * const *pb = b; int cmp = original_compare_function(*pa, *pb); return cmp ? cmp : (pa > pb) - (pa < pb); }
将已排序的项目复制到已排序的数组中.
请注意,这种方法可以在适当的位置工作,但这样做很棘手,并且仍然需要分配指针数组.merge-sort对于稳定排序更加可靠,但需要大约原始数组大小一半的工作空间.