public class MergeSortTest {
private long[] array;
private int length;
public MergeSortTest(long[] array) {
this.array = array;
this.length = array.length;
}
public static void main(String[] args) {
long[] array = new long[]{64, 54, 34, 56, 85, 43, 32, 13, 43, 65, 67};
MergeSortTest arr = new MergeSortTest(array);
arr.display();
arr.mergeSort();
arr.display();
}
/**
* 先定义一个工作空间,用于存放将要进行归并排序的数据
* 递归对工作空间数组进行归并排序
* 初始状态时:上限为0,下限为length-1
*/
private void mergeSort() {
long[] workspace = new long[length];
recMergeSort(workspace, 0, length - 1);
}
/**
* 递归对工作空间的数组进行排序
*
* @param workspace 工作空间
* @param lowerBound 下限
* @param upperBound 上限
*/
private void recMergeSort(long[] workspace, int lowerBound, int upperBound) {
// 如果上限等于下限,则立刻返回
if(lowerBound == upperBound) return;
// 取得工作空间中间位置的索引
int mid = (lowerBound + upperBound)/2;
// 递归排序工作空间中从下限到中间位置所有数据元素
recMergeSort(workspace, lowerBound, mid);
// 递归排序工作空间中从中间位置下一个位置到上限的所有元素
recMergeSort(workspace, mid + 1, upperBound);
// 将工作空间中已经排序好的数据进行归并
merge(workspace, lowerBound, mid + 1, upperBound);
}
private void merge(long[] workspace, int low, int high, int up) {
// 工作空间的索引指针
int j = 0;
// 原始数组中相对于工作空间的基值
int base = low;
// 中间位置
int mid = high - 1;
// 工作空间中数据元素的个数
int n = up - low + 1;
// 可以将工作空间数组看成是有low-mid, high-up两段空间组成的数组
// 合并两段数组
while(low <= mid) {
if(high <= up)workspace[j++] = array[low] < array[high] ? array[low++] : array[high++];
else workspace[j++] = array[low++];
}
while(high <= up) workspace[j++] = array[high++];
// 最后,将工作空间中有序的数据元素放回原始数组中
for(j = 0; j < n; j++) {
array[base + j] = workspace[j];
}
}
private void display() {
for(int i = 0; i < length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
public void insert(long elem) {
array[length++] = elem;
}
}
归并排序
最新推荐文章于 2024-08-12 19:32:44 发布