九度 1371 最小的K个数
生活随笔
收集整理的這篇文章主要介紹了
九度 1371 最小的K个数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述:輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
輸入:?
第二行包含n個整數,表示這n個數,數組中的數的范圍是[0,1000 000 000]。
此題的不同之處是最后的輸出結果需要是排序過的,一般是不要求這個的。
?
最常見的解法就是使用快速排序和大頂堆。
方法一使用快速排序的思想,劃分的操作不用改,對遞歸部分稍作修改
1 #include<stdio.h> 2 #include<algorithm> 3 using namespace std; 4 int partition(int arr[], int s, int e){//返回分裂位置 5 int x = arr[s];//中軸元素 6 int j = e+1; 7 int i = s; 8 while(i < j){ 9 while(i < e && arr[++i] <= x); 10 while(j > s && arr[--j] > x); 11 if(i >= j) break; 12 swap(arr[j], arr[i]); 13 } 14 arr[s] = arr[j]; 15 arr[j] = x; 16 return j; 17 } 18 int k; 19 void minK(int arr[],int start,int end){ 20 if(start >= end) return; 21 int index = partition(arr,start,end); 22 if(index == k) return; 23 //類似二分的思想,比快速排序要少一個遞歸 24 if(index > k) minK(arr,start,index-1); 25 else minK(arr,index+1,end); 26 } 27 const int M = 200001; 28 int n,arr[M]; 29 int main() 30 { 31 while(scanf("%d%d",&n, &k) != EOF){ 32 for(int i=0; i<n; i++){ 33 scanf("%d", &arr[i]); 34 } 35 --k; 36 minK(arr,0,n-1); 37 sort(arr,arr+k+1);//輸出結果需要是排序的 38 for(int i=0; i<k; i++) 39 printf("%d ",arr[i]); 40 printf("%d\n",arr[k]); 41 } 42 return 0; 43 } View Code方法二使用 大頂堆。
1 #include <algorithm> 2 #include <cstdio> 3 using namespace std; 4 int n,k,a[200000]; 5 void adjustHeap(int idx){ 6 int l = idx*2 + 1; 7 int r = idx*2 + 2; 8 int largeIndex = idx; 9 //先檢查邊界。k即為要創建的堆的大小 10 while( l<k || r<k ){ 11 if(l<k && a[l] > a[largeIndex]) largeIndex = l; 12 if(r<k && a[r] > a[largeIndex]) largeIndex = r; 13 if(largeIndex != idx){ 14 //交換 root和子節點。 15 swap(a[idx], a[largeIndex]); 16 //交換之后繼續調整子節點 17 idx = largeIndex; 18 l = idx*2 + 1; 19 r = idx*2 + 2; 20 }else{ 21 break; //無需調整 22 } 23 } 24 } 25 void buildHeap(){ 26 for(int i= (k-1)/2; i>=0; i--){ 27 adjustHeap(i); 28 } 29 } 30 int main(){ 31 while(scanf("%d%d", &n, &k) != EOF){ 32 for(int i = 0; i < k; i++) 33 scanf("%d", &a[i]); 34 buildHeap(); 35 for(int i = k; i < n; i++){ 36 scanf("%d", &a[i]); 37 if(a[0] > a[i]){ 38 swap(a[0],a[i]); 39 adjustHeap(0); 40 } 41 } 42 sort(a,a+k); 43 for(int i = 0; i<k-1; i++) 44 printf("%d ", a[i]); 45 printf("%d\n", a[k-1]); 46 } 47 } View Code效率差不多
轉載于:https://www.cnblogs.com/qinduanyinghua/p/5693505.html
總結
以上是生活随笔為你收集整理的九度 1371 最小的K个数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux机群下NFS+NIS服务的搭建
- 下一篇: C# 条件语句 if else