自己实现的归并排序算法 详细注释 代码计算机二级考试

文章作者 100test 发表时间 2009:05:08 18:17:37
来源 100Test.Com百考试题网


  2009年下半年全国计算机等级考试你准备好了没?考计算机等级考试的朋友,2009年下半年全国计算机等级考试时间是2009年9月19日至23日。更多优质资料尽在百考试题论坛 百考试题在线题库
  1. 不多废话,我已经把注释写得很详细了,C#实现的分享如下:
  /// <.summary>.
  /// 归并排序之归:归并排序入口
  /// Updated by Lihua at 05/06/2009
  /// <./summary>.
  /// <.param name="data">.无序数组<./param>.
  /// <.returns>.有序数组<./returns>.
  /// <.author>.lihua<./author>.
  /// <.copyright>.www.zivsoft.com<./copyright>.
  int[] Sort(int[] data)
  {
  //若data为null,或只剩下1 or 0个元素,返回,不排序
  if (null == data || data.Length <.= 1)
  {
  return data.
  }
  //取数组中间下标
  //int middle = data.Length / 2. //方法一:除2取整数
  int middle = data.Length >.>. 1.  //方法二:位移 (感谢读者hyper给出的这个效率稍高的方法)
  //初始化临时数组let,right,并定义result作为最终有序数组,若数组元素奇数个,将把多余的那元素空间预留在right临时数组
  int[] left = new int[middle], right = new int[data.Length - middle], result = new int[data.Length].  
  //下面这句对性能有些影响,所以在上面有了改进,直接用data.Length-middle初始化right数组
  //if (data.Length % 2 != 0) right = new int[middle 1].
  //int i = 0, j = 0.
  //foreach (int x in data)//开始排序
  //{
  //if (i <. middle)//填充左数组
  //{
  //left[i] = x.
  //i .
  //}
  //else//填充右数组
  //{
  //right[j] = x.
  //j .
  //}
  //}
  //上面的foreach被改成了for循环
  for (int i = 0. i <. data.Length. i )
  {
  if (i <. middle)//用middle,不用left.Length,会不会好些,呵呵,who knows?
  {
  left[i] = data[i].
  }
  else
  {
  right[i - middle] = data[i]. //此处i-middle,让我省掉定义一个j,性能有所提高
  }
  }
  left = Sort(left).//递归左数组
  right = Sort(right).//递归右数组
  result = Merge(left, right).//开始排序
  //this.Write(result).//输出排序,测试用(lihua debug)
  return result.
  }
  /// <.summary>.
  /// 归并排序之并:排序在这一步
  /// <./summary>.
  /// <.param name="a">.左数组<./param>.
  /// <.param name="b">.右数组<./param>.
  /// <.returns>.合并左右数组排序后返回<./returns>.
  int[] Merge(int[] a, int[] b)
  {
  //定义结果数组,用来存储最终结果
  int[] result = new int[a.Length b.Length].
  int i = 0, j = 0, k = 0.
  while (i <. a.Length &.&. j <. b.Length)
  {
  if (a[i] <. b[j])//左数组中元素小于右数组中元素
  {
  result[k ] = a[i ].//将小的那个放到结果数组
  }
  else//左数组中元素大于右数组中元素
  {
  result[k ] = b[j ].//将小的那个放到结果数组
  }
  }
  while (i <. a.Length)//这里其实是还有左元素,但没有右元素
  {
  result[k ] = a[i ].
  }
  while (j <. b.Length)//右右元素,无左元素
  {
  result[k ] = b[j ].
  }
  return result.//返回结果数组
  }

相关文章


高精度实现10000位数字的乘除法(C )计算机二级考试
C 中string和string.h的作用和区别计算机二级考试
计算机二级:C 中什么是内联函数计算机二级考试
Windows下基于C 的RRDTOOL命令行封计算机二级考试
自己实现的归并排序算法 详细注释 代码计算机二级考试
计算机二级C 辅导:回文判断计算机二级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛