如何用JAVA实现归并排序? 原来在学习归并排序的时候是用C语言做的,因为指针的关系觉得很简单,但是现在学习JAVA却发现没有指针后,简单的归并排序的实现都变得好难,请那位大侠帮我分析下实现的策略,这里先感谢了,最好有源代码。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Arrays的sort用的就是归并排序...看下源代码吧看这个方法private static void mergeSort(Object[] src, Object[] dest, int low, int high, int off) /** *归并排序,要求待排序的数组必须实现Comparable接口 */ public class MergeSort implements SortStrategy { private Comparable[] bridge; /** *利用归并排序算法对数组obj进行排序 */ public void sort(Comparable[] obj) { if (obj == null) { throw new NullPointerException("The param can not be null!"); } bridge = new Comparable[obj.length]; //初始化中间数组 mergeSort(obj, 0, obj.length - 1); //归并排序 bridge = null; } /** *将下标从left到right的数组进行归并排序 *@param obj 要排序的数组的句柄 *@param left 要排序的数组的第一个元素下标 *@param right 要排序的数组的最后一个元素的下标 */ private void mergeSort(Comparable[] obj, int left, int right) { if (left < right) { int center = (left + right)/2; mergeSort(obj, left, center); mergeSort(obj, center + 1, right); merge(obj, left, center, right); } } /** *将两个对象数组进行归并,并使归并后为升序。归并前两个数组分别有序 *@param obj 对象数组的句柄 *@param left 左数组的第一个元素的下标 *@param center 左数组的最后一个元素的下标 *@param right 右数组的最后一个元素的下标 */ private void merge(Comparable[] obj, int left, int center, int right) { int mid = center + 1; int third = left; int tmp = left; while (left <= center && mid <= right) { //从两个数组中取出小的放入中间数组 if (obj[left].compareTo(obj[mid]) <= 0) { bridge[third++] = obj[left++]; } else bridge[third++] = obj[mid++]; } //剩余部分依次置入中间数组 while (mid <= right) { bridge[third++] = obj[mid++]; } while (left <= center) { bridge[third++] = obj[left++]; } //将中间数组的内容拷贝回原数组 copy(obj, tmp, right); } /** *将中间数组bridge中的内容拷贝到原数组中 *@param obj 原数组的句柄 *@param left 要拷贝的第一个元素的下标 *@param right 要拷贝的最后一个元素的下标 */ private void copy(Comparable[] obj, int left, int right) { while (left <= right) { obj[left] = bridge[left]; left++; } } } 集成myeclipse +tomact6.0 JFRME更新 使用JNDI访问DOMINO LDAP服务器数据丢失的问题 scjp的一个题目,关于线程同步的,求具体解 MySQL的JDBC中文问题 嵌套for循环的执行顺序 帮忙:谁有javadoc的帮助文档,给我说个网址 有关线程的两个问题很简单,isInterrupt()和yield() 请问哪里有JAVA文档可以下载? 用java開發B/S 結構的ERP,用哪些開發工具開發起來又快又穩定? ByteBuffer拷贝效率问题(80分相送) 中秋节日快乐,大家帮点忙!
看这个方法
private static void mergeSort(Object[] src,
Object[] dest,
int low,
int high,
int off)
/** *利用归并排序算法对数组obj进行排序 */ public void sort(Comparable[] obj) { if (obj == null) { throw new NullPointerException("The param can not be null!"); }
bridge = new Comparable[obj.length]; //初始化中间数组
mergeSort(obj, 0, obj.length - 1); //归并排序 bridge = null; }
/**
*将下标从left到right的数组进行归并排序 *@param obj 要排序的数组的句柄 *@param left 要排序的数组的第一个元素下标 *@param right 要排序的数组的最后一个元素的下标 */ private void mergeSort(Comparable[] obj, int left, int right) { if (left < right) { int center = (left + right)/2; mergeSort(obj, left, center); mergeSort(obj, center + 1, right); merge(obj, left, center, right); } } /** *将两个对象数组进行归并,并使归并后为升序。归并前两个数组分别有序 *@param obj 对象数组的句柄 *@param left 左数组的第一个元素的下标 *@param center 左数组的最后一个元素的下标 *@param right 右数组的最后一个元素的下标 */ private void merge(Comparable[] obj, int left, int center, int right) { int mid = center + 1; int third = left; int tmp = left; while (left <= center && mid <= right) { //从两个数组中取出小的放入中间数组 if (obj[left].compareTo(obj[mid]) <= 0) { bridge[third++] = obj[left++]; } else bridge[third++] = obj[mid++]; }
//剩余部分依次置入中间数组
while (mid <= right) { bridge[third++] = obj[mid++]; }
while (left <= center)
{ bridge[third++] = obj[left++]; }
//将中间数组的内容拷贝回原数组
copy(obj, tmp, right); }
/**
*将中间数组bridge中的内容拷贝到原数组中 *@param obj 原数组的句柄 *@param left 要拷贝的第一个元素的下标 *@param right 要拷贝的最后一个元素的下标 */ private void copy(Comparable[] obj, int left, int right) { while (left <= right) { obj[left] = bridge[left]; left++; } } }