1、归并排序:
归并排序是将两个或者两个以上的有序序列进行合并的一种排序算法。采用了分治的思想。一般使用递归。
最好、最坏、平均时间复杂度都是O(nlgn)。
由于在归并过程中需要与原始记录序列同样数量的存储空间存放归并结果以及递归深度为lg2n的栈空间,因此
空间复杂度为O(n+logn)
#include<iostream>
#include<cstring>//写个归并排序酸爽一下
using namespace std;
template<typename T>
void Merge(T* a,int first,int mid,int last)
{
T* tmp=new T[last-first+1];
int i=first;
int j=mid+1;
int ti=0;
while(i<=mid && j<=last)
{
if(a[i]<a[j])
tmp[ti++]=a[i++];//一轮赋值后指向待排序的那个值 first---mid , mid+1 ---- last
else
tmp[ti++]=a[j++];
}
if(i<=mid)
{
memcpy(tmp+ti,a+i,sizeof(T)*(mid-i+1));
}
else
{
memcpy(tmp+ti,a+j,sizeof(T)*(last-j+1));
}
memcpy(a+first,tmp,sizeof(T)*(last-first+1));
delete[] tmp;
}
template<typename T>
void Merge_sort(T* a,int low,int high)
{
if(low<high)
{
int mid=low+((high-low)>>2);
Merge_sort(a,low,mid); //第一分段包括mid
Merge_sort(a,mid+1,high); //第二分段不包括mid,从mid+1开始
Merge(a,low,mid,high);
}
return;
}
int main()
{
int n;
while(cin>>n)
{
int* a=new int[n];
for(int i=0;i<n;++i)
cin>>a[i];
Merge_sort(a,0,n-1);
for(int i=0;i<n;++i)
{
cout<<a[i];
if(i==n-1)cout<<endl;
else cout<<",";
}
delete[] a;
}
return 0;
}
2、插入排序:
这里介绍的超好:
http://blog.csdn.net/morewindows/article/details/6665714
3、希尔排序:
插入排序的升级版,将待排序数组分成若干组字数组分别进行插入排序,最后将基本有序的整个数组进行一轮插入排序,效率上比插入排序要好。
这里介绍的很详细:
http://blog.csdn.net/morewindows/article/details/6668714