推荐一篇详细讲解的文章:http://blog.youkuaiyun.com/hackbuteer1/article/details/6568913
内排序
typedef int KeyType;
typedef struct
{
KeyType key;
InfoType data;
}RecType;//排序记录类型定义
插入排序//升序
1.直接插入排序
void InsertSort(RecType r[],int n)//时间复杂度n^2,空间复杂度1
{
int i,j;
RecType tmp;
for(i=1;i<n;i++)
{
tmp=r[i];
j=i-1;
while(j>=0 && tmp.key<r[j].key)
{
r[j+1]=r[j]; j--;
}
r[j+1]=tmp;
}
}
2.二分插入排序
void InsertSort1(RecType r[],int n)//时间复杂度n^2,空间复杂度1
{
int i,j,low,high,mid;
RecType tmp;
for(i=1;i<n;i++)
{
tmp=r[i];
low=0; high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(tmp.key<r[mid].key) high=mid-1;
else low=mid+1;
}
for(j=i-1;j>=high+1;j--) r[j+1]=r[j];
r[high+1]=tmp;
}
}
3.希尔排序
void ShellSort(SqList r[],int n)//时间复杂度n^1.3,空间复杂度1
{
int i,j,gap;
SqList tmp;
gap=n/2;
while(gap>0)
{
for(i=gap;i<n;i++)
{
tmp=r[i]; j=i-gap;
while(j>=0 && tmp.key<r[j].key)
{
r[j+gap]=r[j]; j=j-gap;
}
r[j+gap]=tmp;
}
gap=gap/2;
}
}
交换排序
1.冒泡排序
void BubbleSort(RecType r[],int n)//平均时间复杂度n^2(最坏n^2,最好n),空间复杂度1
{
int i,j;
for(i=0;i<n-1;i++)
{
for(j=n-1;j>i;j--)
if(r[j].key<r[j-1].key)
{
tmp=r[j]; r[j]=r[j-1]; r[j-1]=tmp;
}
}
}
2.快速排序//随机选择基准元素更好
void QuickSort(RecType r[],int s,int t)//平均时间复杂度n*log-n(最坏n^2,最好同平均),空间复杂度log-n(最坏n)
{
int i=s,j=t;
RecType tmp;
if(s<t)
{
tmp=r[s];
while(i!=j)
{
while(j>i && r[j].key>tmp.key) j--;
r[i]=r[j];
while(i<j && r[i].key<tmp.key) i++;
r[j]=r[i];
}
r[i]=tmp;
QuickSort(r,s,i-1);
QuickSort(r,i+1,t);
}
}
选择排序
1.直接选择排序
void SelectSort(RecType r[],int n)//平均时间复杂度:n^2,空间复杂度1
{
int i,j,k;
RecType tmp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(r[j].key<r[k].key) k=j;
if(k!=j)
{
tmp=r[i]; r[i]=r[k]; r[k]=tmp;
}
}
}
2.堆排序
void sift(RecType r[],int low,int high)
{
int i=low,j=2*i;
RecType tmp=r[i];
while(j<=high)
{
if(j<high && r[j].key<r[j+1].key) j++;
if(tmp.key<r[j].key)
{
r[i]=r[j]; i=j; j=2*i;
}
else break;
}
r[i]=tmp;
}
void HeapSort(RecType r[],int n)//时间复杂度:n*log-n,空间复杂度1
{
int i;
RecType tmp;
for(i=n/2;i>=2;i--) sift(r,i,n);
for(i=n;i>=2;i--)
{
tmp=r[1]; r[1]=r[i]; r[i]=tmp;
sift(r,1,i-1);
}
}
归并排序
基数排序