public class MergeSort2 {
public static void main(String[] args) {
int[] arr = {49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51};
mergeSort(arr, 0, 1);
for (int i : arr) {
System.out.println(i);
}
}
/**
* * <pre>
* * 二路归并----递归实现
* * 原理:将两个有序表合并和一个有序表
* * </pre>
* *
* * @param a
* * @param start
* * 第一个有序表的起始下标
* * @param middle
* * 第二个有序表的起始下标
* * @param terminated
* * 第二个有序表的结束小标
* *
*/
private static void merge(int[] a, int start, int middle, int terminated) {
int[] tmp = new int[terminated - start + 1];
int i = start, j = middle, k = 0;
while (i < middle && j <= terminated) {
if (a[i] <= a[j]) {
tmp[k] = a[i];
k++;
i++;
} else {
tmp[k] = a[j];
j++;
k++;
}
}
while (i < middle) {
tmp[k] = a[i];
i++;
k++;
}
while (j <= terminated) {
tmp[k] = a[j];
j++;
k++;
}
System.arraycopy(tmp, 0, a, start, tmp.length);
}
/**
* *
* * @param a
* * @param s
* * @param len
* * 每次归并的有序集合的长度,传入1,实现升序
*/
public static void mergeSort(int[] a, int s, int len) {
int size = a.length;
int mid = size / (len << 1);//中间值等于数组长度size除以len*2
int c = size & ((len << 1) - 1);//逻辑与操作
// -------归并到只剩一个有序集合的时候结束算法-------//
if (mid == 0)
return;
// ------进行一趟归并排序-------//
for (int i = 0; i < mid; i++) {
s = i * 2 * len;
merge(a, s, s + len, (len << 1) + s - 1);
}
// -------将剩下的数和倒数一个有序集合归并-------//
if (c != 0)
merge(a, size - c - 2 * len, size - c, size - 1);
// -------递归执行下一趟归并排序------//
mergeSort(a, 0, 2 * len);
}
}
排序算法-------快速排序
猜你喜欢
转载自blog.csdn.net/weixin_42061676/article/details/81093257
今日推荐
周排行