码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序

时间:2020-01-22 13:13:20      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:src   onclick   表示   数列   ++   tom   swa   tmp   复杂   

输入一个长度为n的整数数列,从小到大输出前m小的数。

输入格式

第一行包含整数n和m。

第二行包含n个整数,表示整数数列。

输出格式

共一行,包含m个整数,表示整数数列中前m小的数。

数据范围

1mn1051≤m≤n≤105,
11091≤数列中元素≤109

输入样例:

5 3
4 5 1 3 2

输出样例:

1 2 3

##############################################################
技术图片
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N = 1e5+10;
 5 int arr[N], cnt;
 6 int n, m;
 7 //O(lgn)
 8 void down(int index){
 9     int tmp = index;
10     //在父节点和孩子节点中找到最小的那个节点
11     if(index*2 <= cnt && arr[index*2] < arr[tmp]) tmp = index*2;
12     if(index*2+1 <= cnt && arr[index*2+1] < arr[tmp]) tmp = index*2+1;
13     if(tmp != index){
14         swap(arr[tmp],arr[index]);
15         down(tmp);
16     }
17 }
18 
19 int main(){
20     cin >> n >> m;
21     cnt = n;
22     for(int i = 1; i<= n;++i)cin >> arr[i];
23     for(int i = n >> 1;i;--i)down(i);//建堆,从最底层之上的一层开始down,因为最底层的没有意义,此处复杂度O(n)
24     while(m--){
25         cout << arr[1] << " ";
26         arr[1] = arr[cnt--];
27         down(1);
28     }
29     return 0;
30 }
View Code

 

end

堆排序

标签:src   onclick   表示   数列   ++   tom   swa   tmp   复杂   

原文地址:https://www.cnblogs.com/sxq-study/p/12228319.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!