#include "stdio.h"
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
ElemType r[MAXSIZE+1];
int length;
}SortList;
void crelist(SortList *L)
{
int i = 0; ElemType x;
printf("Input data(-1:End):");
scanf("%d",&x);
while(x!=-1)
{
if(i>MAXSIZE)
{--i;break;}
L->r[++i] = x;
scanf("%d",&x);
}
L->length = i;
}
void list(SortList *L)
{
int i;
for(i=1;i<=L->length;i++)
{
printf("%5d",i);
}
printf("\n");
for(i=1;i<=L->length;i++)
printf("%5d",L->r[i]);
printf("\n");
}
/*
直接插入排序算法
最好情况:T(n) = O(n)
最坏情况:T(n) = O(n^2)
平均时间性能为T(n)=O(n^2)
*/
void InsertSort(SortList *L)
{
int i,j;
for(i=2;i<=L->length;i++)
{
if(L->r[i]<L->r[i-1])
{
L->r[0] = L->r[i];
for(j=i-1;L->r[0]<L->r[j];j--)
L->r[j+1] = L->r[j]; //比待排序记录关键字大的记录后移
L->r[j+1] = L->r[0];
}
}
}
/*
折半插入排序算法
时间复杂度 O(n^2)
*/
void BiInsertSort(SortList *L)
{
int i,j,low,high,mid;
for(i=2;i<=L->length;i++)
{
L->r[0] = L->r[i];
low = 1; high = i-1;
while(low<=high)
{
mid = (low+high)/2;
if(L->r[0]<L->r[mid])
high = mid - 1;
else low = mid + 1;
}
for(j=i-1;j>=high+1;--j)
L->r[j+1] = L->r[j];
L->r[high+1] = L->r[0];
}
}
//希尔排序 Shell Sort
/*
时间复杂性O(n^4/3)
*/
void ShellSort(int a[],int length)
{
int increment;
int i,j;
int temp;
for(increment=length/2;increment>0;increment/=2) //控制步长,最后递减到1
{
for(i=increment;i<length;i++)
{
temp = a[i];
for(j=i-increment;j>=0&&temp<a[j];j-=increment)
{
a[j+increment] = a[j];
}
a[j+increment] = temp;
}
}
}