堆排序

Posted sxq-study

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序相关的知识,希望对你有一定的参考价值。

输入一个长度为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

以上是关于堆排序的主要内容,如果未能解决你的问题,请参考以下文章

选择排序(简单选择排序堆排序的算法思想及代码实现)

排序--08---堆排序

python代码实现堆排序

算法-java代码实现堆排序

一文带你了解堆排序

堆排序