合并排序采用了分治法的思路来设计排序算法。
主要步骤:
1:分解数组
2:排序子数组
3:合并排序好的子数组
其代码如下:
public interface Sort<T> {
/**
* 返回排序后的数组
* @return
*/
public T[] sort(T[] array);
}
import java.util.Arrays;
import java.util.Comparator;
public abstract class AbstractSort<T> implements Sort<T> {
/**
* 用于比较数组元素大小
*/
protected Comparator<? super T> comp;
public void init(Comparator<? super T> comp){
this.comp = comp;
}
public void print(T[] array){
System.out.println(Arrays.toString(array));
}
public void swap(T[] array,int i ,int j){
T temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
import java.util.Arrays;
import java.util.Comparator;
public class MergeSort<T> extends AbstractSort<T> {
public MergeSort(Comparator<? super T> comp) {
init(comp);
}
@Override
public T[] sort(T[] array) {
sort(array, 0, array.length - 1, array.clone());
return array;
}
/**
* 对指定区间[start,end]的数组元素进行排序
*
* @param start
* @param end
*/
private void sort(T[] src, int start, int end, T[] clone) {
if (start < end) {
int mid = (end + start) / 2;
sort(src, start, mid, clone);
sort(src, mid + 1, end, clone);
merge(src, start, mid + 1, end + 1, clone);
}
}
/**
* 合并子数组[start,mid)和子数组[mid,end)。
*
* @param src
* @param start
* @param mid
* @param end
* @param clone
*/
private void merge(T[] src, int start, int mid, int end, T[] clone) {
System.arraycopy(src, start, clone, start, end - start);
int leftIndex = start;
int rightIndex = mid;
int i = start;
for (; leftIndex < mid && rightIndex < end; i++) {
T l = clone[leftIndex];
T r = clone[rightIndex];
if (comp.compare(r, l) > 0) {
src[i] = l;
leftIndex++;
} else {
src[i] = r;
rightIndex++;
}
}
if (leftIndex < mid) {
System.arraycopy(clone, leftIndex, src, i, mid - leftIndex);
} else // if(rightIndex == end)
{
// 复制右半部分
System.arraycopy(clone, rightIndex, src, i, end - rightIndex);
}
}
public static void main(String[] args) {
MergeSort<Integer> s = new MergeSort<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
Integer[] array = new Integer[] { 3, 5, 9, 8 };
s.sort(array);
System.out.println(Arrays.toString(array));
}
@Override
public String toString() {
return "合并排序";
}
}
分享到:
相关推荐
MIT算法导论——算法顶尖经典教材MIT算法导论——算法顶尖经典教材MIT算法导论——算法顶尖经典教材MIT算法导论——算法顶尖经典教材MIT算法导论——算法顶尖经典教材
计算机系的教材,算法导论————————————————————————————————
算法导论——中文版
算法导论英文版的教师用书 算法导论教师手册.pdf
CLRS for Instructor 《算法导论——教师用书》(有部分习题答案) Computer Algorithms - Introduction to Design and Analysis 3rd - Sara Baase Solutions for CLRS (算法导论部分习题解答)
有助算法入门的同学,对于想在acm程序设计上有所提高的同学是必选手册 。
算法导论,关于算法最权威最全面最深入的书籍,分享给大伙儿~
所有代码都是在我学习这本书时亲手敲出来的,并且调试正确了,包括:第三部分到第六部分(即10-26章),外加第七部分31和32章所有的算法和数据结构以及编程习题还有思考题的C++实现源代码; 第一、二部分学习的较早...
算法界巨著《算法导论》的习题解答,来自于该书著者Cormen博士,包含了对每一章的概括总结和其上课笔记
pdf文件,算法导论中文版,一本风靡全球的书。适合广大大学生使用。项目经验不是关键,缺少的是算法思想。
《算法导论》原书名——《Introduction to Algorithms》,是一本十分经典的计算机算法书籍,与高纳德(Donald E.Knuth)的《计算机程序设计艺术》(《The Art Of Computer Programming》)相媲美《算法导论》自第一...
算法导论是编程领域提升编程境界的必备书籍,他能让你的编程思维突然间变得开阔起来,绝对的好书啊
就是传说中的MIT的算法导论啊,英文原版第二版,很不错的
供大家阅读。算法导论是一本很好的书。其课后思考题更是启发人的思想
这个是关于RandomizedAlgorithms的,英文版
《算法导论》由Thomas H.Cormen、Charles E.Leiserson、Ronald L.Rivest、Clifford Stein四人合作编著(其中Clifford Stein是第二版开始参与的合著者)。本书的最大特点就是将严谨性和全面性融入在了一起。
CLRS 算法导论 课后解答 教师用书
#include void merge(int a[],int b[],int low,int mid,int high) { int h,i,j,k; mid=(low+high)/2; h=low;i=low;j=mid+1; while(h) { if(a[h][j]) {b[i]=a[h];h=h+1;} else {b[i]=a[j];... }
算法导论上的堆排序c++源程序||学习分享