当前位置:编程学习 > C#/ASP.NET >>

大家来看看这个排序怎么实现。。。。

 有一列数组,每个element都是一个自建类型,还有比配的一种比较算法,比较算法仅可以返回两个element的大小关系,返回结果会告诉你,A > B,B < A 或者两者无法比较(或者说不相关),不存在相等的情况,现在要求把这个数列按照相对的大小关系排好,如果其中一个element与其他elements都没有关系,那么他可以存在于这个list的任何地方。
这个list的element不多,也就几十个,但是两两比较耗时,所以希望最后的算法尽量减少比较次数,循环多少次都无所谓~  --------------------编程问答-------------------- 把不能比较的拎出来,剩下的先排序,然后再把不能比较的加上去。 --------------------编程问答--------------------
引用 1 楼 u011303459 的回复:
把不能比较的拎出来,剩下的先排序,然后再把不能比较的加上去。

你怎么把不相关的拎出来呢?  还不得先通过排序算法来筛选?然后剩下的再比较?
你这样比较的次数不是更多了么? --------------------编程问答-------------------- 好像跟一般的排序是一样的啊,只是比较方式不同。用快速排序嘛,遇到不相关的就先放到一个list里去。
这里有讲快速排序的:http://blog.csdn.net/v_JULY_v/article/details/6116297 --------------------编程问答--------------------
引用 1 楼 u011303459 的回复:
把不能比较的拎出来,剩下的先排序,然后再把不能比较的加上去。

这个方法是行的通的,但是比较次数很多了,先是要两两比较,把完全无法比较的剔除,然后再进行剩下的排序,其实剩下的能比较的排序也不是件简单的事,剩下的那些也不是两两都能比较,只能保证其中的某两个能比较,也没有比较好的算法来排序 --------------------编程问答--------------------
引用 2 楼 zhanghs1015 的回复:
Quote: 引用 1 楼 u011303459 的回复:

把不能比较的拎出来,剩下的先排序,然后再把不能比较的加上去。

你怎么把不相关的拎出来呢?  还不得先通过排序算法来筛选?然后剩下的再比较?
你这样比较的次数不是更多了么?

要拎出来就需要两两比较,而且剩下的再比较也很麻烦,主要是剩下的也无法保证两两都有关系。。。 --------------------编程问答--------------------
引用 3 楼 junjun0509 的回复:
好像跟一般的排序是一样的啊,只是比较方式不同。用快速排序嘛,遇到不相关的就先放到一个list里去。
这里有讲快速排序的:http://blog.csdn.net/v_JULY_v/article/details/6116297

快速排序的关键是要选取一个数作为中间节点,但是现在的问题是选取中间节点以后,如果碰到一个数与中间节点的比较结果是无关(即无法比较),那么他应该放在中间节点的左边还是右边,放在左边就永远没机会和右边的的elements比较了,反之也无法和左边的elements比较,非常可能存在漏比的行为 --------------------编程问答--------------------
引用 6 楼 michael135642 的回复:
Quote: 引用 3 楼 junjun0509 的回复:

好像跟一般的排序是一样的啊,只是比较方式不同。用快速排序嘛,遇到不相关的就先放到一个list里去。
这里有讲快速排序的:http://blog.csdn.net/v_JULY_v/article/details/6116297

快速排序的关键是要选取一个数作为中间节点,但是现在的问题是选取中间节点以后,如果碰到一个数与中间节点的比较结果是无关(即无法比较),那么他应该放在中间节点的左边还是右边,放在左边就永远没机会和右边的的elements比较了,反之也无法和左边的elements比较,非常可能存在漏比的行为

哦,我理解错误,以为只要比较一次,无法比较,就可以踢出去了。
这样的话,如果没有更好的办法,我认为还是可以先选择全部放到左边(或者右边),然后将中间点和这个点存到字典里,如果最后这个点比较完都不相关,再跟中间点以右(左)比较一遍,这样还是减少了一些比较次数的。 --------------------编程问答--------------------
引用 7 楼 junjun0509 的回复:
Quote: 引用 6 楼 michael135642 的回复:

Quote: 引用 3 楼 junjun0509 的回复:

好像跟一般的排序是一样的啊,只是比较方式不同。用快速排序嘛,遇到不相关的就先放到一个list里去。
这里有讲快速排序的:http://blog.csdn.net/v_JULY_v/article/details/6116297

快速排序的关键是要选取一个数作为中间节点,但是现在的问题是选取中间节点以后,如果碰到一个数与中间节点的比较结果是无关(即无法比较),那么他应该放在中间节点的左边还是右边,放在左边就永远没机会和右边的的elements比较了,反之也无法和左边的elements比较,非常可能存在漏比的行为

哦,我理解错误,以为只要比较一次,无法比较,就可以踢出去了。
这样的话,如果没有更好的办法,我认为还是可以先选择全部放到左边(或者右边),然后将中间点和这个点存到字典里,如果最后这个点比较完都不相关,再跟中间点以右(左)比较一遍,这样还是减少了一些比较次数的。


没大看懂,是吧中间点和这个点的比较结果放到字典里吗,如果比完左右,都无关的话应该放在哪里呢? --------------------编程问答--------------------
引用 8 楼 michael135642 的回复:
Quote: 引用 7 楼 junjun0509 的回复:

Quote: 引用 6 楼 michael135642 的回复:

Quote: 引用 3 楼 junjun0509 的回复:

好像跟一般的排序是一样的啊,只是比较方式不同。用快速排序嘛,遇到不相关的就先放到一个list里去。
这里有讲快速排序的:http://blog.csdn.net/v_JULY_v/article/details/6116297

快速排序的关键是要选取一个数作为中间节点,但是现在的问题是选取中间节点以后,如果碰到一个数与中间节点的比较结果是无关(即无法比较),那么他应该放在中间节点的左边还是右边,放在左边就永远没机会和右边的的elements比较了,反之也无法和左边的elements比较,非常可能存在漏比的行为

哦,我理解错误,以为只要比较一次,无法比较,就可以踢出去了。
这样的话,如果没有更好的办法,我认为还是可以先选择全部放到左边(或者右边),然后将中间点和这个点存到字典里,如果最后这个点比较完都不相关,再跟中间点以右(左)比较一遍,这样还是减少了一些比较次数的。


没大看懂,是吧中间点和这个点的比较结果放到字典里吗,如果比完左右,都无关的话应该放在哪里呢?

你不是说 "如果其中一个element与其他elements都没有关系,那么他可以存在于这个list的任何地方" ? --------------------编程问答-------------------- 事先要明确比较的规则。
你的情况比较类似扑克牌的比较,先把能比较的分别放成一堆,比如,先按花色分成四堆(大小王不考虑)。这时候,你要有花色的比较规则,比如黑桃大于红桃。

然后,再对分成的小堆中的数据进行排序。

最后,组合到一块。

这就是基数排序:http://www.cnblogs.com/CSharpSPF/p/3242214.html
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,