洛谷1177 快排 归并 堆排

归并排序

#include <bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
#define res register int 
int a[maxn],c[maxn];
 
void merg_sort(int l,int r,int c[])
{
    if(l>=r) return;
    int mid=(l+r)>>1;
    merg_sort(l,mid,c);
    merg_sort(mid+1,r,c);
    int y1=l,y2=mid+1,i;
    for(i=l;i<=r&&y1<=mid&&y2<=r;i++){
        if(c[y1]>=c[y2]){
            a[i]=c[y2];
            y2++;
        }else if(c[y1]<c[y2]){
            a[i]=c[y1];
            y1++;
        }
    }
    if(y1<=mid){
        for(res j=y1;j<=mid;j++){
            a[i++]=c[j];
        }
    }else{
        for(res j=y2;j<=r;j++){
            a[i++]=c[j];
        }
    }
    for(i=l;i<=r;i++){
        c[i]=a[i];
    }
    return; 
}
 
int main()
{
    int N;
    cin>>N;
    for(res i=0;i<N;i++){
        scanf("%d",&a[i]);
        c[i]=a[i];    
    }
    merg_sort(0,N-1,c);
    for(res i=0;i<N;i++)
        printf("%d ",a[i]);
    return 0;
}

 

堆排序

#include <bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
#define inf 0x3f3f3f
#define res register int 
int c[maxn];
 
void swap(int &a,int &b)
{
    int temp=a;
    a=b;
    b=temp;
}
 
 
void HeapAdjust(int l,int r)
{
    int temp=c[l];
    for(res i=l*2;i<=r;i*=2){
        if(i<r&&c[i]<c[i+1]) i++;
        if(temp>=c[i]) break;
        c[l]=c[i]; 
        l=i;
    }    
    c[l]=temp;
} 
 
int main()
{
    int N;
    cin>>N;
    for(res i=1;i<=N;i++)
        scanf("%d",&c[i]);
    for(res i=N/2;i>=1;i--)
        HeapAdjust(i,N);
    for(res i=N;i>1;i--){
        swap(c[1],c[i]);
        HeapAdjust(1,i-1);
    }
                
    for(res i=1;i<N;i++)
        printf("%d ",c[i]);
    printf("%d\n",c[N]); 
    return 0;
}

 

posted @ 2020-10-25 09:48  new-code  阅读(85)  评论(0)    收藏  举报