找回密码
 立即注册

QQ登录

只需一步,快速开始

quab1

高级会员

14

主题

70

帖子

1972

积分

高级会员

积分
1972

活字格认证

quab1
高级会员   /  发表于:2010-4-11 16:40  /   查看:5427  /  回复:3
array.sort怎么排序2维数组的某一维啊?有人知道吗?不想自己写排序但是又不知道怎么排序,数组比较大,能不能不复制到另一个一维数组排序,或者谁知道什么其他排序的函数?谢谢

3 个回复

倒序浏览
Arthas
葡萄城公司职员   /  发表于:2010-4-11 17:14:00
沙发
呃, copy的话有个CopyTo方法。
排序一般直接用Array.Sort来做了。

据有一次Carl同学和我聊天的时候说, .net实现的sort比他们优化了半天的算法还要好。。。

当然那次他在算法问题上狠狠的鄙视了我一番。
扯淡第一高手
回复 使用道具 举报
gerry
论坛元老   /  发表于:2010-4-12 17:58:00
板凳
怎么看.net的sort方法?我一直以为.net的sort方法是native方法。
求源码~~~
回复 使用道具 举报
gerry
论坛元老   /  发表于:2010-4-12 18:03:00
地板
  1. internal void QuickSort(int left, int right)
  2. {
  3.     do
  4.     {
  5.         int low = left;


  6.         int hi = right;
  7.         int median = Array.GetMedian(low, hi);
  8.         this.SwapIfGreaterWithItems(low, median);
  9.         this.SwapIfGreaterWithItems(low, hi);
  10.         this.SwapIfGreaterWithItems(median, hi);
  11.         object y = this.keys.GetValue(median);
  12.         do
  13.         {
  14.             try
  15.             {
  16.                 while (this.comparer.Compare(this.keys.GetValue(low), y) < 0)
  17.                 {
  18.                     low++;
  19.                 }
  20.                 while (this.comparer.Compare(y, this.keys.GetValue(hi)) < 0)
  21.                 {
  22.                     hi--;
  23.                 }
  24.             }
  25.             catch (IndexOutOfRangeException)
  26.             {
  27.                 throw new ArgumentException(Environment.GetResourceString("Arg_BogusIComparer", new object[] { y, y.GetType().Name, this.comparer }));
  28.             }
  29.             catch (Exception exception)
  30.             {
  31.                 throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_IComparerFailed"), exception);
  32.             }
  33.             if (low > hi)
  34.             {
  35.                 break;
  36.             }
  37.             if (low < hi)
  38.             {
  39.                 object obj3 = this.keys.GetValue(low);
  40.                 this.keys.SetValue(this.keys.GetValue(hi), low);
  41.                 this.keys.SetValue(obj3, hi);
  42.                 if (this.items != null)
  43.                 {
  44.                     object obj4 = this.items.GetValue(low);
  45.                     this.items.SetValue(this.items.GetValue(hi), low);
  46.                     this.items.SetValue(obj4, hi);
  47.                 }
  48.             }
  49.             if (low != 0x7fffffff)
  50.             {
  51.                 low++;
  52.             }
  53.             if (hi != -2147483648)
  54.             {
  55.                 hi--;
  56.             }
  57.         }
  58.         while (low <= hi);
  59.         if ((hi - left) <= (right - low))
  60.         {
  61.             if (left < hi)
  62.             {
  63.                 this.QuickSort(left, hi);
  64.             }
  65.             left = low;
  66.         }
  67.         else
  68.         {
  69.             if (low < right)
  70.             {
  71.                 this.QuickSort(low, right);
  72.             }
  73.             right = hi;
  74.         }
  75.     }
  76.     while (left < right);
  77. }




复制代码
  1. internal void SwapIfGreaterWithItems(int a, int b)
  2. {
  3.     if (a != b)
  4.     {
  5.         try
  6.         {
  7.             if (this.comparer.Compare(this.keys.GetValue(a), this.keys.GetValue(b)) > 0)
  8.             {
  9.                 object obj2 = this.keys.GetValue(a);
  10.                 this.keys.SetValue(this.keys.GetValue(b), a);
  11.                 this.keys.SetValue(obj2, b);
  12.                 if (this.items != null)
  13.                 {
  14.                     object obj3 = this.items.GetValue(a);
  15.                     this.items.SetValue(this.items.GetValue(b), a);
  16.                     this.items.SetValue(obj3, b);
  17.                 }
  18.             }
  19.         }
  20.         catch (IndexOutOfRangeException)
  21.         {
  22.             throw new ArgumentException(Environment.GetResourceString("Arg_BogusIComparer", new object[] { this.keys.GetValue(b), this.keys.GetValue(b).GetType().Name, this.comparer }));
  23.         }
  24.         catch (Exception exception)
  25.         {
  26.             throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_IComparerFailed"), exception);
  27.         }
  28.     }
  29. }




复制代码
  1. [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  2. private static int GetMedian(int low, int hi)
  3. {
  4.     return (low + ((hi - low) >> 1));
  5. }




复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部