归并排序

来源:互联网 发布:ubuntu怎么挂载u盘 编辑:程序博客网 时间:2024/05/19 18:43
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;}}

原创粉丝点击