1>快速排序
分治,需要注意的点是边界的取值
以j为边界时:mid = q[l+r >> 1]; qsort(l,j),qsort(j+1,r);
以i为边界时:mid = q[l+r+1 >> 1]; qsort(l,i-1),qsort(i,r);
避免数组无限划分(无论数组是从0还是1开始都是这样)
void qsort(int l,int r)
{
if(l >= r)
return ;
int i = l-1,j = r+1,mid = q[l+r>>1];
//i = l-1,j = r+1,mid = q[l+r+1 >> 1];
while(i < j)
{
do i++;while(q[i] < mid);
do j--;while(q[j] > mid);
if(i < j)
swap(q[i],q[j]);
}
qsort(l,j);
qsort(j+1,r);
//qsort(l,i-1); qsort(i,r);
}
(Ps:代码为从小到大排序)
2>归并排序
双指针,首先递归到底层,然后借助额外开的temp数组对每个小区间内的数进行排序,在小区间基本有序的前提下递归回退实现整个区间的排序
void merge_sort(int q[],int l,int r)
{
if(l >= r)
return ;
int mid = (l+r)>>1;
merge_sort(q,l,mid),merge_sort(q,mid+1,r);
int k = 0,i = l,j = mid+1;
int t[N];
while(i <= mid && j <= r)
{
if(q[i] < q[j])
t[k++] = q[i++];
else
t[k++] = q[j++];
}
while(i <= mid)
t[k++] = q[i++];
while(j <= r)
t[k++] = q[j++];
for(i = l,k = 0;i <= r;i++,k++)
q[i] = t[k];
}
3>堆排序
#include <iostream>
using namespace std;
const int N = 100010;
int q[N];
int n;
void down(int x)
{
int t = x;
if(2*x <= n && q[2*x] < q[t])
t = 2*x;
if(2*x+1 <= n && q[2*x+1] < q[t])
t = 2*x+1;
if(t != x)
{
swap(a[t],q[x]);
down(t);
}
}
int main()
{
int m;
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++)
scanf("%d",&q[i]);
for(int i = n/2;i >= 1;i--)
down(i);
while(m--)
{
printf("%d ",q[1];
q[1] = q[n];
down(1);
n--;
}
return 0;
}