public void mergeSort(int[] ints, int[] merge, int start, int end) { if (start >= end) return; int mid = (end + start) >> 1; mergeSort(ints, merge, start, mid); mergeSort(ints, merge, mid + 1, end); merge(ints, merge, start, end, mid); } private void merge(int[] a, int[] merge, int start, int end,int mid) { int i = start; int j = mid+1; int pos = start; while( i <= mid || j <= end ){ if( i > mid ){ while( j <= end ) merge[pos++] = a[j++]; break; } if( j > end ){ while( i <= mid ) merge[pos++] = a[i++]; break; } merge[pos++] = a[i] >= a[j] ? a[j++] : a[i++]; } for (pos = start; pos <= end; pos++) a[pos] = merge[pos]; }
堆排序:PriorityQueue,优先级队列,依据优先级进行排序,可实现最大堆,最小堆
public static void main(String[] args){ int[] arr = {20,25,63,10,98,52,46,32,85,74,97}; getGreatestK(arr, 5); } public static void getGreatestK(int[] arr,int k){ if( arr == null || arr.length < k) return; Queue<Integer> queue = new PriorityQueue<>(11,new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { // TODO Auto-generated method stub return o2 - o1; } }); for(int i=0; i<arr.length;++i){ queue.offer(arr[i]); } for(int i=0; i<k; ++i){ System.out.print(queue.peek() + " "); queue.poll(); } }