堆排序
Posted sxq-study
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序相关的知识,希望对你有一定的参考价值。
输入一个长度为n的整数数列,从小到大输出前m小的数。
输入格式
第一行包含整数n和m。
第二行包含n个整数,表示整数数列。
输出格式
共一行,包含m个整数,表示整数数列中前m小的数。
数据范围
1≤m≤n≤1051≤m≤n≤105,
1≤数列中元素≤1091≤数列中元素≤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 }
end
以上是关于堆排序的主要内容,如果未能解决你的问题,请参考以下文章