前言
写给自己的话: 由于刷普及题发现,很多题可能需要数列有序;或者是要将某些操作嵌入到某种排序里,因此今天对三种常见的排序,快速排序,归并排序,堆排序做了个总结,以及写了自己可以用的模板,以后可以套着用。
由于之前疏忽,现在修正一下堆排序代码
#include <stdio.h>
#include <stdlib.h>
void quicksort(int left,int right,int a[]){ //快速排序模板
if(left>=right)
return;
int k=a[left],i=left,j=right;
while(i<j){
while(i<j&&a[j]>k)
j--;
if(i<j){
a[i]=a[j];
i++;
}
while(i<j&&a[i]<=k)
i++;
if(i<j){
a[j]=a[i];
j--;
}
}
a[i]=k;
quicksort(left,i-1,a);
quicksort(i+1,right,a);
return;
}
void Merge(int left,int mid,int right,int a[],int b[]){ //归并排序模板
int i,j=mid+1,k=left;
for(i=left;i<=right;i++)
b[i]=a[i];
i=left;
while(i<=mid&&j<=right){
if(b[i]<b[j]){
a[k]=b[i];
k++;
i++;
}else{
a[k]=b[j];
k++;
j++;
}
}
while(i<=mid){
a[k]=b[i];
i++;
k++;
}
while(j<=right){
a[k]=b[j];
j++;
k++;
}
return;
}
void Mergesort(int left,int right,int a[],int b[]){
if(left>=right)
return;
int mid=(left+right)/2;
Mergesort(left,mid,a,b);
Mergesort(mid+1,right,a,b);
Merge(left,mid,right,a,b);
int main(int argc, char *argv[]) {
int n;
scanf("%d",&n);
int a[n],b[n],i;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
/*
quicksort(0,n-1,a);
Mergesort(0,n-1,a,b);*/
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
堆排序修改如下:
#include <stdio.h>
#include <stdlib.h>
void Heap_adjust(int n,int a[],int left,int right){
int rc=a[left],i;
for(i=2*left;i<=right;i*=2){
if(i<right&&a[i+1]>a[i])
i++;
if(rc>a[i])
break;
else{
a[left]=a[i];
left=i;
}
}
a[left]=rc;
return;
}
void Heap_sort(int n,int a[]){
int i,temp;
for(i=n/2;i>0;i--){
Heapa_djust(n,a,i,n);
}
for(i=n;i>1;i--){
temp=a[i];
a[i]=a[1];
a[1]=temp;
Heapa_djust(n,a,1,i-1);
}
return;
}
int main(int argc, char *argv[]) {
int n,i;
scanf("%d",&n);
int a[n+1];
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
Heap_sort(n,a);
printf("\n\n");
for(i=1;i<=n;i++){
printf("%d ",a[i]);
}
return 0;
}