日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信息学奥赛一本通(1235:输出前k大的数)——堆排序

發布時間:2025/3/17 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息学奥赛一本通(1235:输出前k大的数)——堆排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1235:輸出前k大的數


時間限制: 1000 ms ??? ??? 內存限制: 65536 KB
提交數: 12715 ??? 通過數: 4043

【題目描述】

給定一個數組,統計前k大的數并且把這k個數從大到小輸出。

【輸入】

第一行包含一個整數n,表示數組的大小。n < 100000。

第二行包含n個整數,表示數組的元素,整數之間以一個空格分開。每個整數的絕對值不超過100000000。

第三行包含一個整數k,k < n。

【輸出】

從大到小輸出前k大的數,每個數一行。

【輸入樣例】

10 4 5 6 9 8 7 1 2 3 0 5

【輸出樣例】

9 8 7 6 5

【分析】

? ? ? ? 這道題很好求解,實際上就是將給定的數進行排序,然后將前k大的數輸出即可。排序算法有很多種,最簡單的方法是C++用sort函數,C語言用qsort函數即可。

? ? ? ? 這道題被放到分治法專題,即將大問題轉化為小問題,分治法排序一般就是快速排序、歸并算法和堆算法。其中歸并算法可以參見1182:合影效果,這里我們就用堆算法實現。堆算法的原理請見文章:圖解排序算法(三)之堆排序。

【參考代碼】

#include<stdio.h> #define N 100010 int a[N];void swap(int arr[],int i,int j) //交換樹中兩個結點值 {int tmp;tmp=arr[i];arr[i]=arr[j];arr[j]=tmp; } void heapify(int tree[],int n,int i) //調整小根數 {int c1,c2,min;if(i>=n)return;c1=2*i+1;c2=2*i+2;min=i;if(c1<n && tree[c1] < tree[min])min=c1;if(c2<n && tree[c2] < tree[min])min=c2;if(min!=i){swap(tree,min,i);heapify(tree,n,min);} } void build_heap(int tree[],int n) //建小根數 {int last_node = n-1;int parent = (last_node-1)/2;int i;for(i=parent;i>=0;i--)heapify(tree,n,i); } void heap_sort(int tree[],int n) //堆排序 {int i;build_heap(tree,n);for(i=n-1;i>=0;i--){swap(tree,i,0);heapify(tree,i,0);} } int main() {int i;int n,k;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d\n",&a[i]);heap_sort(a,n);scanf("%d",&k);for(i=0;i<k;i++)printf("%d\n",a[i]);return 0; }

http://ybt.ssoier.cn:8088/problem_show.php?pid=1235

總結

以上是生活随笔為你收集整理的信息学奥赛一本通(1235:输出前k大的数)——堆排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。