首页 / 软件开发 / 数据结构与算法 / 根据Merge Sort原理,自己实现的归并排序算法+详细注释+代码
根据Merge Sort原理,自己实现的归并排序算法+详细注释+代码2010-06-09 博客园 周利华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;//返回结果数组 }
收藏该网址