DSharp 无心之心,道之所存
寻找生命的意义
posts - 31,  comments - 90,  trackbacks - 1

发现.net排序算法的Bug!
.Net Framework 的ArrayList的Sort使用了快速排序算法,只要加入的元素实现IComparable接口,就可调用Sort方法快速排序,但最近在编程中发现了此算法的Bug,如下例子。

using System;
using System.Collections;
using System.Diagnostics;
namespace SortTest
{
    
/// <summary>
    
/// Summary description for Class1.
    
/// </summary>

    class SortTest
    
{
        
/// <summary>
        
/// The main entry polong for the application.
        
/// </summary>

        [STAThread]
        
static void Main(string[] args)
        
{
            ArrayList list 
= new ArrayList();
            TestItem item1 
= new TestItem(1"1");
            TestItem item2 
= new TestItem(1"2");
            TestItem item3 
= new TestItem(1"3");
            TestItem item4 
= new TestItem(1"4");
            TestItem item5 
= new TestItem(1"5");
            TestItem item6 
= new TestItem(1"6");
            list.Add(item3);
            list.Add(item1);
            list.Add(item2);
            list.Add(item4);
            list.Add(item6);
            list.Add(item5);

            list.Sort();

            
foreach(TestItem item in list)
                Console.WriteLine(item.Name);

            Console.ReadLine();
        }


        
public class TestItem : IComparable
        
{
            
private int x;
            
public int X
            
{
                
get
                
{
                    
return x;
                }

            }


            
private string name;
            
public string Name
            
{
                
get
                
{
                    
return name;
                }

            }


            
public TestItem(int x, string name)
            
{
                
this.x = x;
                
this.name = name;
            }

        
            
public int CompareTo(object obj)
            
{
                TestItem item 
= obj as TestItem;
                Debug.Assert(item 
!= null);
                
return (int)(this.x - item.x);
            }

        }

    }

}


期望输出:3,1,2,4,6,5
实际输出:4,6,5,3,1,2

发现在排序的过程中,对于相等的对象,排序后前后位置被折半对调了,所以如果排序的对象中如果相等,输出不能保证原来的顺序。

posted @ 2004-11-12 19:10 DSharp 阅读(1344) | 评论 (6)编辑
Free Web Counter

<2004年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

与我联系

搜索

 

常用链接

留言簿(3)

随笔分类(26)

随笔档案(31)

文章分类(1)

文章档案(2)

收藏夹(1)

最新随笔

积分与排名

  • 积分 - 17981
  • 排名 - 2399

最新评论

  • 1. re: 关于网易网站最近变动的一点看法。
  • 当你登录网易邮箱,试图在它的新闻评论中发表一些看法时;你也许就会发现--网易可以容忍近乎于极为低级下流的言论,却难以允许网民发表一些真实的、并无过激不当的所谓涉政言论。 因此,网易的这种低俗与奴性在很...
  • --LJWH

阅读排行榜

评论排行榜