1、快速排序,每次数轴归位,按照数轴位置二分。数轴归位的同时前面都是比它小的数,后面都是比它大的数。
2、归并排序,就是存二分,回调的时候合并即可。需要利用辅助空间。
3、堆排序,数组下标辅助,先建堆,每次替换堆顶与最后一个元素(由小到大排序就要建大根堆)
#include<stdio.h>
//C中vector和数组不一样,前者传参需要&,后者数组名就是地址
void Qsort(int a[],int l,int r){
if(l>=r) return;
int i=l;
int j=r;
int temp=a[l]; //数轴
while(i!=j)
{
while(i<j&&a[j]>=temp)
j--;
if(j>i)
a[i]=a[j];
while(i<j&&a[i]<=temp)
i++;
if(i<j)
a[j]=a[i];
}
a[i]=temp; //数轴归位
Qsort(a,l,i-1);
Qsort(a,i+1,r);
}
void Union(int a[],int l,int mid,int r){
int temp[r-l+1]; //辅助空间
int i=l,j=mid+1;
int p=0;
while(i<=mid&&j<=r){
if(a[i]<=a[j])
temp[p++]=a[i++];
else
temp[p++]=a[j++];
}
while(i<=mid){
temp[p++]=a[i++];
}
while(j<=r){
temp[p++]=a[j++];
}
for(i=l,j=0;i<=r;i++){
a[i]=temp[j++];
}
}
void Mergesort(int a[],int l,int r){
if(l>=r) return;
int mid=(l+r)/2;
Mergesort(a,l,mid);
Mergesort(a,mid+1,r);
//合并
Union(a,l,mid,r);
}
void MaxHeap(int a[],int n){
//数组下标辅组,找到第一个有孩子的节点
for(int i=n/2-1;i>=0;i--){
int l=i*2+1,r=i*2+2; //下标从0开始
int temp=l; //肯定会有个左孩子
if(r<n){ //如果有右孩子
temp=(a[l]>a[r])?l:r;
}
if(a[temp]>a[i]){
int x=a[temp];
a[temp]=a[i];
a[i]=x;
}
}
}
void Heapsort(int a[],int n)
{
//建成大根堆
MaxHeap(a,11);
//每次替换,减小长度,得到由小到大的序列
int len=n;
for(int i=0;i<len-1;i++){
int x=a[0];
a[0]=a[n-1];
a[n-1]=x;
MaxHeap(a,--n);
}
}
int main()
{
int a[11]={1,9,8,2,3,5,6,7,0,12,4};
//Qsort(a,0,10);
//Mergesort(a,0,10);
Heapsort(a,11);
for(int i=0;i<11;i++){
printf("%d ",a[i]);
}
return 0;
}