给定一个无序数组,找到其中最小的K个数
来源:互联网 发布:阿里云产品vpc 编辑:程序博客网 时间:2024/04/29 16:47
/**
* 给定一个无序数组,找到其中最小的K个数
* @author Administrator
*
*/
public class getMinKNum {
public static void main(String[] args) {
}//利用最大堆public static int[] getMinKNumByHeap(int[]arr ,int k){ if(arr==null ||arr.length<k|| k<0){ return null; } int[] kHeap = new int[k]; for(int i =0 ; i<k; i++){ heapInsert(kHeap,arr[i],i); } for(int i=k; i<arr.length; i++){ if(kHeap[0]>arr[i]){ kHeap[0] = arr[i]; heapify(kHeap, 0, k); } } return kHeap;} //建堆的过程public static void heapInsert(int[] heap, int value, int index){ heap[index] = value; int parent = (index-1)/2; while(index!=0){ if(heap[index]>heap[parent]){ swap(heap,index,parent); index = parent; }else{ break; } }}//调整的过程public static void heapify(int[] heap, int index, int heapSize){ int left = 2*index +1; int right = 2*index +2; int largest = index; while(left < heapSize){ if(heap[index]<heap[left]){ //swap(heap,index,left); largest = left; } if(right < heapSize && heap[largest]<heap[right]){ largest = right; } if(index!=largest){ swap(heap,index,largest); }else{ break; } index = largest; left = 2*index +1; right = 2*index +2; }}public static void swap(int[] arr, int low, int high){ int temp = arr[low]; arr[low] = arr[high]; arr[high] = temp;}public static int partition(int[] arr,int start,int end){ if(arr==null || arr.length==0){ return -1; } int l = start; int r = end; int temp = arr[l]; if(l<r){ while(l<r && temp >= arr[r]){ r--; } if(l<r){ arr[l++]=arr[r]; } while(l<r && temp < arr[l]){ l++; } if(l<r){ arr[r--] = arr[l]; } } arr[l] = temp; return l;}//利用快排思想public static void getKNum(int[] arr,int start,int end, int k){ int index = partition(arr, start, end); while(index != k-1){ if(index < k-1){ index = partition(arr, index+1, end); }else if(index > k-1){ index = partition(arr, start, index-1); }else{ return; } }}
}
0 0
- 给定一个无序数组,找到其中最小的K个数
- 给定一个无序的整型数组arr,找到其中最小的k个数。
- 找到无序数组中最小的K个数
- 无序数组中找到第K小的数(或者找到最小的K个数)
- 无序数组最小的k个数
- 无序数组中最小的k个数
- 无序数组中最小的K个数
- 无序数组中最小的k个数
- 无序数组中的最小的k个数
- 无序数组中最小的k个数
- 无序数组最小的K个数
- 数组与矩阵---找到无序数组中最小的k个数
- 【极难】【BFPRT算法】找到无序数组中最小的K个数
- 找到数组中最小的K个数
- 在一个无序数组中找到第K个最小或者最大的元素
- 找出无序数组中最小的前k个数
- 找出无序数组中最小的前k个数
- 求无序数组之中最小的k个数
- 修改Visual Studio的界面风格
- Serializable 和 Parcelable两种方式传递对象
- uva757 - - Gone Fishing
- CSS Position属性
- 小试循环
- 给定一个无序数组,找到其中最小的K个数
- 第二周项目3——小试循环(5)
- 14. Longest Common Prefix(leetcode)
- Android 解决65535的限制
- coreboot学习0:二度相逢是初识
- 自考C++程序设计试题2009年10月
- 最少步数
- 《JAVA与模式》之观察者模式
- MySQL索引详解-02