一 . 简单插入排序:是指将无序序列中的各元素依次插入到已经有序的线性表中, 思想就是:在一个无序表中,把最初始第一个元素作为有序表,从第二个数开始一直到最后都插入到前面 有序表中,最终就得到有序表了。
希尔排序: 对插入排序做了较大改进,基本思想就是把整个无序序列分割成若干个小的子序列分别进行插入排序。不如最开始把相隔k=n/2的值作为一个子序列分别进行 插入排序,排序完后,又将相隔 k=k/2 的值的一个子序列分别进行插入排序,..以此一直到k=0结束,整个排序结束。
二. 简单插入排序C++表示:
#include <iostream>
using namespace std;
template <class T>
void insort(T p[],int n)
{
int j,k;
T t;
for(j=1;j<n;j++)//把第一个数作为顺序表,把第二到最后一个数往里面顺序插入
{
t=p[j];
k=j-1;
while((k>=0)&&p[k]>t)
{
p[k+1]=p[k];
k=k-1;
}
p[k+1]=t;
}
return;
}
三.希尔排序C++表示:
#include <iostream>
using namespace std;
template <class T>
void shellsort(T p[],int n)
{
int i,j,k;
T t;
k=n/2; //初始增量值
while(k>0)
{
for(i=k;i<=n-1;i++)
{
t=p[i];j=i-k;
while((j>=0)&&p[j]>t)
{
p[j+k]=p[j];j=j-k;
}
p[j+k]=t;
}
k=k/2;//缩小增量值
}
return;
}
四. 具体应用实例:
/*#include "qck.h"*/
#include <iomanip>
#include <ctime>
#include "insort.h"
#include "shellsort.h"
int main()
{
int i,j;
/* double p[50],r=1.0;*/
int p[50];
// for(i=0;i<50;i++) //产生50个0~1之间的随机数
// {
// r=2053.0*r+13849.0;j=r/65536.0;
// r=r-j*65536.0;p[i]=r/65536.0;
// }
// for(i=0;i<50;i++) //产生50个100~300之间的随机数
// {
// p[i]=100.0+200.0*p[i];
// }
srand(time(0));
for(i=0;i<50;i++)
{
p[i]=rand()%500;
}
cout<<"排序前的序列:"<<endl;
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
cout<<setw(10)<<p[5*i+j];
cout<<endl;
}
//bobsort(p+20,10);//冒泡排序
//qck(p,50);//快速排序
//insort(p+10,40);//插入排序
shellsort(p,50);//希尔排序
cout<<"排序后的序列:"<<endl;
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
cout<<setw(10)<<p[5*i+j];
cout<<endl;
}
return 0;
}
五 .实验结果