0.前言
排序大法好啊!
1.正文
快速排序
#include <cstdio>
using namespace std;
int a[1000001];
void swap(int &a,int &b) { int temp=a; a=b; b=temp; }
void cmpswap(int &a,int &b) { if(a > b) swap(a,b); }
void qsort(int a[],int l,int r)
{
if(l >= r) return;
int s=l+(r-l)/2;
cmpswap(a[s],a[l]),cmpswap(a[l],a[r]);
int p=a[l];
int i=l+1,j=r;
while(true)
{
while(a[j]>p) j--;
while(a[i]<p&&i<r) i++;
if(i < j) swap(a[i++],a[j--]);
else{ swap(a[l],a[j]); break; }
}
qsort(a,l,j-1);
qsort(a,j+1,r);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
qsort(a,1,n);
for(int i=1;i<=n;i++)
{
if(i != n) printf("%d ",a[i]);
else printf("%d\n",a[i]);
}
return 0;
}
堆排序
// 从小到大排序
#include <cstdio>
int n,h[100005];
void swap(int x,int y) { int t; t=h[x],h[x]=h[y],h[y]=t; }
void siftdown(int i)
{
int t,flag=0;
while(i*2<=n && flag==0)
{
if(h[i] < h[i*2]) t=i*2;
else t=i;
if(i*2+1<=n && h[t]<h[i*2+1]) t=i*2+1;
if(t != i) { swap(t,i); i=t; }
else flag=1;
}
}
void creat() { for(int i=n/2;i>=1;i--) siftdown(i); }
void heapsort()
{
while(n > 1)
{
swap(1,n);
n--;
siftdown(1);
}
}
int main()
{
int num;
scanf("%d",&num);
for(int i=1;i<=num;i++) scanf("%d",&h[i]);
n=num;
creat(); heapsort();
for(int i=1;i<=num;i++) printf("%d ",h[i]);
return 0;
}
另一种堆排序
#include <bits/stdc++.h>
#define ll long long
using namespace std;
priority_queue<int,vector<int>,greater<int> >a;
int main()
{
int n;
cin >> n;
for(int i=1,b;i<=n;i++)
{
cin >> b;
a.push(b);
}
while(!a.empty())
{
cout << a.top() << " ";
a.pop();
}
return 0;
}