当前位置:  开发笔记 > 编程语言 > 正文

无法快速排序变得稳定排序?

如何解决《无法快速排序变得稳定排序?》经验,为你挑选了1个好方法。

这看起来像家庭作业,所以我不打算完全解决它:

通过确保没有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对于稳定排序更加可靠,但需要大约原始数组大小一半的工作空间.



1> chqrlie..:

这看起来像家庭作业,所以我不打算完全解决它:

通过确保没有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对于稳定排序更加可靠,但需要大约原始数组大小一半的工作空间.


不,我说比较函数不应该返回"0":如果相同的元素根据它们在数组中的原始位置比较非零,那么你的排序将是稳定的.
推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有