上面说了简单排序,简单排序的平均时间为o(n^2),复杂排序中的平均时间复杂度为o(nlogn),但是简单排序有两个优点,辅助空间复杂度为O(1),都是稳定排序,反正排序方法各有优缺点,具体的如下表:
这张表介绍了基本排序方法,数据引用于博客http://blog.csdn.net/whuslei/article/details/6442755。
看些希尔排序代码:由于希尔排序的步长的确定是关键性的,这里space=len/n;所以n的取值决定了希尔排序的快慢
void shell_sort(int *a,int len,int n)
{
for (int space=len/n,k=len;k>0;space=((space/(float)n)<1&&(space/(float)n)>0)?1:space/3,k=k/3)//步长的选择,分成n组
{
for (int i=0;i<space;i++)//插入排序
{
for (int j=i+space;j<len;j+=space)
{
int temp=j-space;
int temp2=j;
while (a[temp2]<a[temp]&&temp>=i)
{
swap(a[temp2],a[temp]);
temp2-=space;
temp-=space;
}
}
}
}
}
int main()
{
int a[]={9,4,13,2,1,7,5,0,-5};
int len=sizeof(a)/sizeof(a[0]);
shell_sort(a,len,1);
return 0;
}
堆排序代码:
#include<iostream>
#include <algorithm>
using namespace std;
void adjust_heap(int *a,int i,int len)
{
for (int j=2*(i+1),last=-1;j<len+1&&j!=last;j=2*(i+1))
{
last=j;
if (j<len)
{
if(a[j]>a[j-1])
{
if(a[j]>a[i])
{
swap(a[i],a[j]);
i=j;
}
}
else if (a[j-1]>a[i])
{
swap(a[i],a[j-1]);
i=j-1;
}
}
else if (j-1<len)
{
if (a[j-1]>a[i])
{
swap(a[i],a[j-1]);
i=j-1;
}
}
}
}
void heap_sort(int *a,int len)
{
for (int i=(len-1)/2-1;i>=0;i--) adjust_heap(a,i,len);//建立大顶堆,出来的是从大到小的顺序
for (int i=0;i<len;i++)
{
swap(a[0],a[len-1-i]);
adjust_heap(a,0,len-i-1);//每次调整的都是0的位置
}
}
int main()
{
int a[]={9,4,13,2,1,7,5,0,8};
int len=sizeof(a)/sizeof(a[0]);
heap_sort(a,len);
return 0;
}
归并排序:
#include<iostream>
#include <algorithm>
using namespace std;
void mymerge(int *a,int first,int mid,int last,int *b)
{
int k=0,i,j;
for ( i=first,j=mid+1;i<=mid&&j<=last;)
{
if(a[i]>a[j]) b[k++]=a[j++];
else b[k++]=a[i++];
}
while(i<=mid) b[k++]=a[i++];
while(j<=last) b[k++]=a[j++];
for (i= 0; i<k; i++)
a[first+i] = b[i];//
}
void msort(int *a,int first,int last,int *b)
{
if(first!=last)
{
int mid=(first+last)/2;
msort(a,first,mid,b);
msort(a,mid+1,last,b);
mymerge(a,first,mid,last,b);
}
}
void merge_sort(int *a,int n)
{
if(n==0) return;
int *b=new int[n];
msort(a,0,n-1,b);
delete[]b;
}
int main()
{
int a[]={9,4,13,2,1,7,5,0};
int len=sizeof(a)/sizeof(a[0]);
merge_sort(a,len);
return 0;
}
快速排序:
//快速排序
#include<iostream>
#include <algorithm>
using namespace std;
int partion(int *a,int low,int high)
{
int key=a[low];
while(low<high)
{
while(low<high&&a[high]>=key) high--;
swap(a[high],a[low]);
while (low<high&&a[low]<=key) low++;
swap(a[low],a[high]);
}
return low;
}
void q_sort(int *a,int low,int high)
{
if (low<high)
{
int center=partion(a,low,high);
q_sort(a,low,center);
q_sort(a,center+1,high);
}
}
void quick_sort(int *a,int len)
{
q_sort(a,0,len-1);
}
int main()
{
int a[]={9,4,13,2,1};
int len=sizeof(a)/sizeof(a[0]);
quick_sort(a,len);
return 0;
}