#include<iostream>
using namespace std;
const int maxsize=100005;
int arr[maxsize];
int ta[maxsize];//归并排序使用的临时数组
void quickSort(int a[],int l,int r){//快速排序
if(l>=r) return;
int i=l-1,j=r+1,x=a[l+r>>1];
while(i<j){
do i++;while(a[i]<x);
do j--;while(a[j]>x);
if(i<j) swap(a[i],a[j]);
}
quickSort(a,l,j),quickSort(a,j+1,r);
}
void mergeSort(int a[],int l,int r){//归并排序
if(l>=r) return;
int mid=l+r>>1;
mergeSort(a,l,mid),mergeSort(a,mid+1,r);
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r){
if(a[i]<=a[j]) ta[k++]=a[i++];
else ta[k++]=a[j++];
}
while(i<=mid) ta[k++]=a[i++];
while(j<=r) ta[k++]=a[j++];
for(k=0,i=l;i<=r;i++) a[i]=ta[k++];
}
void sift(int arr[],int low,int high){//堆排序调整函数
int i=low,j=2*i+1;
int temp=arr[i];
while(j<=high){
if(j<high&&arr[j]<arr[j+1])//j<high表示当前节点有左右孩子
j++;//将j指向左右孩子较大的那一个
if(temp<arr[j]){
arr[i]=arr[j];
i=j;
j=2*i+1;
}
else
break;
}
arr[i]=temp;
}
void heapSort(int arr[],int n){//堆排序
for(int i=n/2-1;i>=0;i--)//建大根堆过程
sift(arr,i,n-1);
for(int i=n-1;i>=0;i--){//排序过程
int temp=arr[0];
arr[0]=arr[i];
arr[i]=temp;
sift(arr,0,i-1);
}
}
int main(){
int n;cin>>n;
for(int i=0;i<n;i++)
cin>>arr[i];
//quickSort(arr,0,n-1);
//mergeSort(arr,0,n-1);
heapSort(arr,n);
//保证行尾无空格
for(int i=0;i<n-1;i++)
cout<<arr[i]<<" ";
cout<<arr[n-1];
return 0;
}
洛谷P1177 【模板】排序(快速排序、归并排序、堆排序)
于 2024-08-14 10:37:24 首次发布