package org.opencloudb.mpp.tmp; import java.util.BitSet; import java.util.Comparator; public interface MemMapSorter { MemMapSorter HEAP_SORTER = new HeapSorter(); MemMapSorter MERGE_SORTER = new MergeSorter(); void sort(MemMapBytesArray arr, Comparator<byte[]> cmp); /** * 堆排序 * * @author Czp */ class HeapSorter implements MemMapSorter { public void sort(MemMapBytesArray arr, Comparator<byte[]> cmp) { buildHeap(arr, cmp); int n = arr.size(); for (int i = n - 1; i >= 1; i--) { arr.swap(0, i); heapify(arr, 0, i, cmp); } } private void buildHeap(MemMapBytesArray arr, Comparator<byte[]> cmp) { int n = arr.size(); for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, i, n, cmp); } private void heapify(MemMapBytesArray arr, int idx, int max, Comparator<byte[]> cmp) { int index = 2 * idx; int left = index + 1;// 左孩子的下标 int right = index + 2;// 左孩子的下标 int largest = 0;// 3个节点中最大值节点的下标 if (left < max && cmp.compare(arr.get(left), arr.get(idx)) > 0) largest = left; else largest = idx; if (right < max && cmp.compare(arr.get(right), arr.get(largest)) > 0) largest = right; if (largest != idx) { arr.swap(largest, idx); heapify(arr, largest, max, cmp); } } } /** * 原地归并 * * @author Czp */ class MergeSorter implements MemMapSorter { public void sort(MemMapBytesArray arr, Comparator<byte[]> cmp) { mergeSort(arr, 0, arr.size() - 1, cmp); } private void reverse(MemMapBytesArray arr, int left, int size) { int right = size - 1; while (left < right) { arr.swap(left++, right--); } } /*** * 必须保证[start,mid](mid,right]<br/> * 是有序的 三次翻转后[start,right]就<br/> * 是有序数组 * * @param arr * @param start * @param mid * @param right */ private void swap(MemMapBytesArray arr, int start, int mid, int right) { reverse(arr, start, mid);/* 先翻转左手 */ reverse(arr, mid, right);/* 再翻转右手 */ reverse(arr, start, right);/* 两个手一起翻转 */ } private void merge(MemMapBytesArray arr, int beg, int mid, int end, Comparator<byte[]> cmp) { int i = beg; int j = mid + 1; while (i < j && j <= end) { byte[] jValue = arr.get(j); while (i < j && cmp.compare(arr.get(i), jValue) <= 0) ++i; int index = j; byte[] iValue = arr.get(i); while (j <= end && cmp.compare(arr.get(j), iValue) <= 0) ++j; // swap [i,index) and [index,j) swap(arr, i, index, j); i += (j - index); } } private void mergeSort(MemMapBytesArray arr, int beg, int end, Comparator<byte[]> cmp) { if (beg < end) { int mid = (beg + end) / 2; mergeSort(arr, beg, mid, cmp); mergeSort(arr, mid + 1, end, cmp); merge(arr, beg, mid, end, cmp); } } } /** * 位图排序,仅支持不重复的数字 * * @author czp * */ class BitMapSorter { public static void sort(int[] arr, int maxValue) { BitSet bs = new BitSet(); for (int i : arr) { bs.set(i); } int j = 0, i = 0; while (i <= maxValue && j < arr.length) { if (bs.get(i)) arr[j++] = i; i++; } } } }