HDU 1425 sort(堆排序/快排/最大堆/最小堆)
Description
给你n个整数,请按从大到小的顺序输出其中前m大的数。
Input
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
Output
对每组测试数据按从大到小的顺序输出前m大的数。
Sample Input
5 3
3 -35 92 213 -644
Sample Output
213 92 3
1、使用内建sort函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include<iostream> #include<algorithm> #include<cstdio> using namespace std; int ans[1000001]; int main() { int n,m; while ( scanf ( "%d%d" ,&n,&m) != EOF) { for ( int i = 0;i < n;i++) { scanf ( "%d" ,&ans[i]); } sort(ans,ans + n); printf ( "%d" ,ans[n - 1]); for ( int i = n - 2;m > 1;m--,i--) { printf ( " %d" ,ans[i]); } printf ( "\n" ); } return 0; } |
2、使用内建优先队列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include<iostream> #include<queue> #include<cstdio> using namespace std; int main() { int N,M; while (~ scanf ( "%d%d" ,&N,&M)) { priority_queue< int >que; bool first = true ; int tmp; while (N--) { scanf ( "%d" ,&tmp); que.push(tmp); } while (M--) { first? printf ( "%d" ,que.top()): printf ( " %d" ,que.top()); que.pop(); first = false ; } printf ( "\n" ); } return 0; } |
3、使用内部堆函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <cstdio> #include <algorithm> using namespace std; static int a[1000000]; int main() { int i,n,m; while (EOF != scanf ( "%d %d" ,&n,&m)) { for (i=0;i<n;i++) scanf ( "%d" ,&a[i]); make_heap(a,a+n); printf ( "%d" ,a[0]); for (i=1;i<m;i++) { pop_heap(a,a+n-i+1); printf ( " %d" ,a[0]); } printf ( "\n" ); } return 0; } |
4、手写最大堆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include<stdio.h> #include<string.h> const int maxn = 1000005; int heap[maxn],sz = 0; void push( int x) { int i = sz++; while (i > 0) { int p = (i - 1)/2; if (heap[p] >= x) break ; heap[i] = heap[p]; i = p; } heap[i] = x; } int pop() { int ret = heap[0]; int x = heap[--sz]; int i = 0; while (i*2+1<sz) { int a = i*2+1,b = i*2+2; if (b < sz && heap[b]>heap[a]) a = b; if (heap[a] <= x) break ; heap[i] = heap[a]; i = a; } heap[i] = x; return ret; } int main() { int n,m,tmp; while (~ scanf ( "%d%d" ,&n,&m)) { sz = 0; memset (heap,0, sizeof (heap)); for ( int i = 0;i < n;i++) scanf ( "%d" ,&tmp),push(tmp); for ( int i = 1;i < m;i++) printf ( "%d " ,pop()); printf ( "%d\n" ,pop()); } return 0; } |
5、手写堆排序(从大到小)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include<bits/stdc++.h> using namespace std; #define LeftChild(i) (2*(i)+1) const int maxn = 1000005; int a[maxn]; void PercDown( int a[], int i, int N) { int Child; int tmp; for (tmp = a[i];LeftChild(i) <N;i = Child) { Child = LeftChild(i); if (Child != N - 1 && a[Child+1] < a[Child]) Child++; if (tmp > a[Child]) a[i] = a[Child]; else break ; } a[i] = tmp; } void Heapsort( int a[], int N) { int i; for (i = N/2;i >= 0;i--) PercDown(a,i,N); for (i = N-1;i > 0;i--) { swap(a[0],a[i]); PercDown(a,0,i); } } int main() { int n,m; while (~ scanf ( "%d%d" ,&n,&m)) { for ( int i = 0;i < n;i++) scanf ( "%d" ,&a[i]); Heapsort(a,n); printf ( "%d" ,a[0]); for ( int i = 1;i < m;i++) printf ( " %d" ,a[i]); printf ( "\n" ); } return 0; } |
6、手写堆排序(从小到大)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include<cstdio> #include<algorithm> using namespace std; #define LeftChild(i) (2*(i)+1) const int maxn = 1000005; int a[maxn]; void PercDown( int a[], int i, int N) { int Child; int tmp; for (tmp = a[i];LeftChild(i) <N;i = Child) { Child = LeftChild(i); if (Child != N - 1 && a[Child+1] > a[Child]) Child++; if (tmp < a[Child]) a[i] = a[Child]; else break ; } a[i] = tmp; } void Heapsort( int a[], int N) { int i; for (i = N/2;i >= 0;i--) PercDown(a,i,N); for (i = N-1;i > 0;i--) { swap(a[0],a[i]); PercDown(a,0,i); } } int main() { int n,m; while (~ scanf ( "%d%d" ,&n,&m)) { for ( int i = 0;i < n;i++) scanf ( "%d" ,&a[i]); Heapsort(a,n); printf ( "%d" ,a[n-1]); for ( int i = n-2;i > n-1 - m;i--) printf ( " %d" ,a[i]); printf ( "\n" ); } return 0; } |
7、手写快速排序(从大到小)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include<bits/stdc++.h> using namespace std; #define Cutoff (3) const int maxn = 1000005; int a[maxn]; void InsertionSort( int a[], int N) { int i,j,tmp; for (i = N - 2;i >= 0;i--) { tmp = a[i]; for (j = i;j < N - 1 && a[j + 1] > tmp;j++) a[j] = a[j + 1]; a[j] = tmp; } } int median3( int a[], int left, int right) { int center = (left + right) / 2; if (a[left] < a[center]) swap(a[left],a[center]); if (a[left] < a[right]) swap(a[left],a[right]); if (a[center] < a[right]) swap(a[center],a[right]); swap(a[center],a[left + 1]); return a[left + 1]; } void qsort ( int a[], int left, int right) { int i,j,pivot; if (left + Cutoff <= right) { pivot = median3(a,left,right); i = left + 1;j = right; for (;;) { while (a[++i] > pivot){} while (a[--j] < pivot){} if (i < j) swap(a[i],a[j]); else break ; } swap(a[j],a[left + 1]); qsort (a,left,j - 1); qsort (a,j + 1,right); } else InsertionSort(a + left,right - left + 1); } int main() { int n,m; while (~ scanf ( "%d%d" ,&n,&m)) { for ( int i = 0;i < n;i++) scanf ( "%d" ,&a[i]); qsort (a,0,n - 1); printf ( "%d" ,a[0]); for ( int i = 1;i < m;i++) printf ( " %d" ,a[i]); printf ( "\n" ); } return 0; } |
8、手写快速排序(从小到大)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include<bits/stdc++.h> using namespace std; const int Cutoff = 10; const int maxn = 1000005; int a[maxn]; void InsertionSort( int a[], int N) { int i,j,tmp; for (i = 1;i < N;i++) { tmp = a[i]; for (j = i;j > 0 && a[j - 1] > tmp;j--) a[j] = a[j - 1]; a[j] = tmp; } } int median3( int a[], int left, int right) { int center = (left + right) / 2; if (a[left] > a[center]) swap(a[left],a[center]); if (a[left] > a[right]) swap(a[left],a[right]); if (a[center] > a[right]) swap(a[center],a[right]); swap(a[center],a[right-1]); return a[right-1]; } void qsort ( int a[], int left, int right) { int i,j,pivot; if (left + Cutoff <= right) { pivot = median3(a,left,right); i = left;j = right-1; for (;;) { while (a[++i] < pivot){} while (a[--j] > pivot){} if (i < j) swap(a[i],a[j]); else break ; } swap(a[i],a[right-1]); qsort (a,left,i - 1); qsort (a,i + 1,right); } else InsertionSort(a + left,right - left + 1); } int main() { int n,m; while (~ scanf ( "%d%d" ,&n,&m)) { for ( int i = 0;i < n;i++) scanf ( "%d" ,&a[i]); qsort (a,0,n - 1); printf ( "%d" ,a[n - 1]); for ( int i = n - 2;i > n - m - 1;i--) printf ( " %d" ,a[i]); printf ( "\n" ); } return 0; } |
┆ 凉 ┆ 暖 ┆ 降 ┆ 等 ┆ 幸 ┆ 我 ┆ 我 ┆ 里 ┆ 将 ┆ ┆ 可 ┆ 有 ┆ 谦 ┆ 戮 ┆ 那 ┆ ┆ 大 ┆ ┆ 始 ┆ 然 ┆
┆ 薄 ┆ 一 ┆ 临 ┆ 你 ┆ 的 ┆ 还 ┆ 没 ┆ ┆ 来 ┆ ┆ 是 ┆ 来 ┆ 逊 ┆ 没 ┆ 些 ┆ ┆ 雁 ┆ ┆ 终 ┆ 而 ┆
┆ ┆ 暖 ┆ ┆ 如 ┆ 地 ┆ 站 ┆ 有 ┆ ┆ 也 ┆ ┆ 我 ┆ ┆ 的 ┆ 有 ┆ 精 ┆ ┆ 也 ┆ ┆ 没 ┆ 你 ┆
┆ ┆ 这 ┆ ┆ 试 ┆ 方 ┆ 在 ┆ 逃 ┆ ┆ 会 ┆ ┆ 在 ┆ ┆ 清 ┆ 来 ┆ 准 ┆ ┆ 没 ┆ ┆ 有 ┆ 没 ┆
┆ ┆ 生 ┆ ┆ 探 ┆ ┆ 最 ┆ 避 ┆ ┆ 在 ┆ ┆ 这 ┆ ┆ 晨 ┆ ┆ 的 ┆ ┆ 有 ┆ ┆ 来 ┆ 有 ┆
┆ ┆ 之 ┆ ┆ 般 ┆ ┆ 不 ┆ ┆ ┆ 这 ┆ ┆ 里 ┆ ┆ 没 ┆ ┆ 杀 ┆ ┆ 来 ┆ ┆ ┆ 来 ┆
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)