#include "stdafx.h"
#include <iostream>
/直接插入排序
void InsertSort(int p[],int length)
{
int i,j,temp;
for(i=0;i<length;i++)
{
temp=p[i];
j=i-1;
while(temp<p[j])
{
p[j+1]=p[j];
j--;
}
p[j+1]=temp;
}
cout<<"直接插入排序为:";
for(i=0;i<length;i++)
{cout<<p[i]<<" ";}
cout<<endl;
}
折半插入排序///
void HInsertSort(int s[],int length)
{//对顺序表s进行折半插入排序,结果是s由无序到有序
int i,j,low,high,mid;
for(i=1;i<length;i++)
{
s[0]=s[i]; //保存待插入元素
low=1;high=i-1; //设置初始区间
while(low<=high) //该循环语句完成确定插入位置
{
mid=(low+high)/2;
if(s[0]>s[mid])
low=mid+1; //插入位置在高半区中
else
high=mid-1; //插入位置在低半区中
}
for(j=i-1;j>=high+1;j--) //high+1为插入位置
s[j+1]=s[j]; //后移元素,留出插入空位
s[high+1]=s[0]; //将元素插入
}
cout<<"折半插入排序为:";
for(i=1;i<length;i++)
{cout<<s[i]<<" ";}
cout<<endl;
}
希尔排序///
void shell(int s[],int length)//希尔排序
{
int i,j,k,temp;
k=length/2;
while(k>=1)
{
for(i=k+1;i<=length;i++)
{
temp=s[i];
j=i-k;
while((s[j]>temp)&&(j>=0))
{
s[j+k]=s[j];
j=j-k;
}
s[j+k]=temp;
}
k=k/2;
}
for(i=0;i<length;i++)
{s[i]=s[i+1];}
cout<<"希尔排序为:";
for(i=0;i<length;i++)
{
cout<<s[i]<<" ";
}
}
int _tmain(int argc, _TCHAR* argv[])
{
InsertSort(a,1 0);//直接插入排序
int b[]={90,20,18,30,10,5,1,40,25,50};//第一个元素值为哨兵位
HInsertSort(b,10);//折半插入排序
int c[]={32,10,13,16,55,12,90,51,30,23};//希尔排序
shell(c,10);
system("pause");
return 0;
}