#快速排序
#include <iostream>
using namespace std;
int a[1000],n;
//一趟快排
int quickpass(int a[],int l,int r)
{
int x;
x=a[l];
while(l<r)
{
while(l<r&&a[r]>=x) r--;
if(l<r)
{
a[l]=a[r];
l++;
}
while(l<r&&a[l]<=x) l++;
if(l<r)
{
a[r]=a[l];
r--;
}
}
a[l]=x;
return l;
}
//完整的快排
void quicksort(int a[],int l,int r)
{
int pos;
if(l<r)
{
pos=quickpass(a,l,r);
quicksort(a,l,pos-1);
quicksort(a,pos+1,r);
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
quicksort(a,0,n-1);
for(int i=0;i<n;i++)
cout <<a[i]<<" ";
return 0;
}
#堆排序
#include <iostream>
using namespace std;
int r[100],n;
//重建堆
void sift(int r[],int k,int m)
{
int x;
int i,j,finished=false;
x=r[k];
i=k;
j=2*i;
while(j<=m&&!finished)
{
if(j+1<=m&&r[j]<r[j+1]) j++;
if(x>=r[j]) finished=true;
else
{
r[i]=r[j];
i=j;
j=2*i;
}
}
r[i]=x;
}
//建初堆
void creat_heap(int r[],int n)
{
int i;
for(i=n/2;i>=1;i--)
sift(r,i,n);
}
//堆排序
void heapsort(int r[],int n)
{
creat_heap(r,n);
int i;int t;
for(i=n;i>=2;i--)
{
t=r[1];
r[1]=r[i];
r[i]=t;
sift(r,1,i-1);
}
}
int main()
{
cin>>n;
int i;
for(i=1;i<=n;i++)
cin>>r[i];
heapsort(r,n);
for(i=1;i<=n;i++)
cout<<r[i]<<" ";
return 0;
}
这有一篇讲解堆排序的博文,写的很好,易懂,转载于博主阿顾同学:堆排序算法(图解详细流程)
#希尔排序
#include <iostream>
using namespace std;
int r[100],delta[100],n,dl=0;
//一趟希尔插入排序
void shellinsert(int r[],int n,int delta)
{
int i,j;
for(i=1+delta;i<=n;i++)
if(r[i]<r[i-delta])
{
r[0]=r[i];
for(j=i-delta;j>0&&r[0]<r[j];j-=delta)
r[j+delta]=r[j];
r[j+delta]=r[0];
//cout<<r[i-delta]<<" "<<r[i]<<endl;
}
}
//希尔排序
void shellsort(int r[],int n,int delta[],int dl)
{
int i;
for(i=0;i<dl;i++)
shellinsert(r,n,delta[i]);
}
int main()
{
cin>>n;
int i,t;
t=n;
for(i=1;i<=n;i++)
cin>>r[i];
//求间隔
for(i=0;;i++)
{
if(t)
{
delta[i]=t/2;
t/=2;dl++;
}
else
break;
}
shellsort(r,n,delta,dl);
for(i=1;i<=n;i++)
cout <<r[i]<<" ";
return 0;
}
#比较
排序算法 | 时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 |
---|---|---|---|---|
快速排序 | O( nlog2n ) | O( nlog2n ) | O(n^2) | O( log2n ) |
堆排序 | O( nlog2n ) | O( nlog2n ) | O( nlog2n ) | O(1) |
希尔排序 | O(n^1.5) | O(1) |