归并排序(mergeSort)是建立在归并操作上的一种有效的排序算法,该算法采用分治法。将以有序的子序列合并,得到一个完全有序的序列,即:先使得每个子序列有序,再使得子序列段间有序。如果将两个有序表合成一个有序表,称为:二路归并。
我们采用二路归并如图演示:
分解的过程,我们可以借助递归,不停的往下分解,直到只有一个元素分解完成。
合并的过程,就是我们合并两个有序的数组,我们主要是比较两个元素,小的先放,然后放较大的元素。
public static void mergeSort(long[] array) {
mergeSortRange(array, 0, array.length);
}
private static void mergeSortRange(long[] array, int from, int to) {
if (to - from <= 1) {
return;
}
int mid = (to + from) / 2;
mergeSortRange(array, from, mid);
mergeSortRange(array, mid, to);
//合并
merge(array, from, mid, to);
}
private static void merge(long[] array, int from, int mid, int to) {
int size = to - from;
long[] array2 = new long[size];
int k1 = from;
int k2 = mid;
int k3 = 0;
while (k1 < mid && k2 < to) {
if (array[k1] <= array[k2]) {
array2[k3++] = array[k1++];
} else {
array2[k3++] = array[k2++];
}
}
while (k1 < mid) {
array2[k3++] = array[k1++];
}
while (k2 < to) {
array2[k3++] = array[k2++];
}
for (int i = 0; i < size; i++) {
array[from + i] = array2[i];
}
}
public static void mergeSort(long[] array) {
for (int i = 1; i < array.length; i = i * 2) {
for (int j = 0; j < array.length; j = j + 2 * i) {
int low = j;
int mid = j + i;
if (mid >= array.length) {
continue;
}
int high = mid + i;
if (high > array.length) {
high = array.length;
}
merge(array, low, mid, high);
}
}
}
1.FileUploadServlet.java文件,实现上传处理 import java.io.File;import java....
%@ language = vbscript% % Response.Expires = 0 % html head title 星河影动之...
在做table页面时,有时对td设置的宽度是无效的,td的宽度始终有内部的内容撑开,...
重复数据在数据分析和搜索中会造成错误。在我们的实际使用中我们应该避免重复导...
本文实例讲述了正则表达式教程之元字符的使用。分享给大家供大家参考,具体如下...
本文转载自微信公众号「猿天地」,作者尹吉欢 。转载本文请联系猿天地公众号。 ...
对于正则表达式的中\B和\b 有些地方会出现弄不懂的情况 或许你看了下面这篇博客 ...
在微信小程序项目中,开发模块涉及到手写签名功能,微信小程序canvas闪亮登场 前...
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个...
0.先抛问题 假设字段category无索引且有重复值,order by category 和 limit 组...