排序:重新排列表中元素,使表中元素满足按关键字有序的过程
1、直接插入排序:
void InsertSort(int A[],int n)//监视哨为A[0],后面n位为要排的序列
{
if (n<2)
printf("Error");
else
{
int i,j;
for(i=2; i<=n; i++)
{
if(A[i]<A[i-1])
{
A[0]=A[i];//复制哨兵
for(j=i-1; A[0]<A[j]; j--)
A[j+1]=A[j];
A[j+1]=A[0];
}
}
for(i=1; i<=n; i++)
printf("%d ",A[i]);
}
}
2、折半插入排序
void InsertSort(int A[],int n)
{
int i,j,low,high,mid;
for(i=2; i<=n; i++)
{
A[0]=A[i];
low=1;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(A[mid]>A[0])
high=mid-1;
else
low=mid+1;
}
for(j=i-1; j>=high+1; --j)
{
A[j+1]=A[j];
}
A[high+1]=A[0];
}
}
实例解析:
3、希尔排序
void ShellSort(int A[],int n)
{
int i,j,k,dk;
for(dk=n/2; dk>=1; dk=dk/2) //步长变化
{
for(i=dk+1; i<=n; ++i)
if(A[i]<A[i-dk])
{
A[0]=A[i];
for(j=i-dk; j>0&&A[0]<A[j]; j-=dk)
A[j+dk]=A[j];
A[j+dk]=A[0];
}
for(k=1; k<=n; k++)
printf("%d ",A[k]);
printf("\n");
}
}