【正确答案】算法由主函数和直接插入排序、折半插入排序、希尔排序、输出五个函数组成。
程序如下:
#include<stdio.h>
#define LENGTH 8
void InsertSort(int r[],int n) /*直接插入排序*/
{
inti,j;
for(i=2;i<n;++i) /*认为第一个数有序,i从2开始*/
if(r[i]<r[i-1]) /*若小于,将r[i]插入有序序列中*/
{
r[0]=r[i]; /*r[i]的值放入监视哨中*/
for(j=i-1;r[0]<r[j];--j)
r[j+1]=r[j]; /*记录后移*/
r[j+1]=r[0]; /*插入到正确位置*/
}
printdata(r,n);
}
void BinSort(int r[],int n) /*折半插入排序*/
{
int i,J,low,high,m; /*定义变量,其中low,high表示查找的上下界*/
for(i=2;i<n;++i) /*认为第一个数有序,i从2开始*/
{
r[0]=r[i]; /*将r[i]暂时存入r[0]中*/
low=1;
high=i-1; /*置有序序列区间的初值*/
while(low<=high) /*从r[low]到r[high]折半查找插入位置*/
{
m=(low+high)/2; /*折半,取中间位置送m*/
if(r[0]<r[m])
high=m-1; /*插入位置在低半区*/
else
low=m+1; /*插入位置在高半区*/
}
for(j=i-1;j>=high+1;--j)
r[j+1]=r[j]; /*插入位置以后的记录后移*/
r[high+1]=r[0]; /*插入记录*/
}
printdata(r,n);
}
void ShellSort(int r[],int n) /*希尔排序*/
{
int i,J,d;
d=n/2; /*取第一个步长值*/
while(d>=1) /*步长d>=1*/
{
for(i=d;i<n;i++) /*对每组进行直接插入排序*/
{
r[0]=r[i]; /*记录r[i]暂存入r[0]中*/
j=i-d: /*确定每组中的记录r[i]前一个位置*/
while((j>0)&&(r[0]<r[j])) /*在组中查找插入位置*/
{
r[j+d]=r[j]; /*记录后移*/
j=j-d; /*记录位置前移一个步长*/
}
r[j+d]=r[0]; /*插入记录*/
}
d=d/2; /*缩小步长值*/
}
printdata(r,n);
}
void printdata(int r[],int n)
{
int i;
for(i=1;i<n;i++)
printf("/%d",r[i]);
}
main() /*主程序*/
{
int r[LENGTH+1]={0,1,7,3,2,0,5,6,8};/*定义数组并赋初值*/
int r1[LENGTH+1]; /*暂用数组*/
int i,n=LENGTH+1;
for(i=0;i<=LENGTH;i++) /*复制数组*/
r1[i]=r[i];
printf("\nlnsertSort output:");
InsertSort(r1,n); /*直接插入排序并输出*/
for(i=0;i<LENGTH;i++) /*复制数组*/
r1[i]=r[i];
printf("\nBinSort output:");
BinSort(r1,n); /*折半插入排序并输出*/
for(i=0;i<LENGTH;i++) /*复制数组*/
r1[i]=r[i];
printff("\nShellSort output:");
ShellSort(r1,n); /*希尔排序并输出*/
}
输出结果为:
InsertSort output:0 1 2 3 5 6 7 8
BinSort output:0 1 2 3 5 6 7 8
SheliSort output:0 1 2 3 5 6 7 8
【答案解析】