您的位置:首页 > 其它

归并算法--MergeSort

2016-03-28 21:36 369 查看
三国有云:天下大势分久必合,合久必分。

归并算法就充分表象了这一点,归并算法的基本思想就先将大数组分成小数组,再将小数组分成可以比较大小的两元数组,之后就是合的过程;合的过程中是要对元素进行排序的,两个较小的数组各元素比较后重新排序,再添加到大的数组上,直到合并完成。还是有图好分析问题:



百度了一下归并算法,里面只描述归并算法的下半部分,其实分的过程也挺重要,如果不分到最底层,就合得到的结果就不会相同,而且都不知道怎么比较了,之前我没看懂就是在这一点上没有分析到位。如何才能分到最底层,这就需要递归调用了,直到满足条件才开始合的过程。

代码实现:

public class MergeSort implements Sort {

public void sort(int[] data) {
int[] temp = new int[data.length];
mergeSort(data, temp, 0, data.length - 1);
display(data);
}

private void mergeSort(int[] data, int[] temp, int l, int r) {
int mid = (l + r) / 2;
if (l == r) //递归到最底层
return;
mergeSort(data, temp, l, mid); //通过递归分治数组
mergeSort(data, temp, mid + 1, r);//通过递归分治数组
for (int i = l; i <= r; i++) {
temp[i] = data[i];
}
//先排序,后合并
int n = l;
int m = mid + 1;
for (int cur = l; cur <= r; cur++) {
if (n == mid + 1)
data[cur] = temp[m++];
else if (m > r)
data[cur] = temp[n++];
else if (temp
< temp[m])
data[cur] = temp[n++];
else
data[cur] = temp[m++];
}
}

public void display(int[] data) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + "-----");
}
}

public static void main(String[] args) {
MergeSort sort = new MergeSort();
int[] array = { 6,202,100,301,38,8,1 };
sort.sort(array);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: