**
希尔排序 C++
**
这里就不讲原理了,原理大家都懂,就是不会敲代码 //泪目了//
#include <iostream>
#include <stdio.h>
using namespace std;
#define Max 500 /*N为数据量大小*/
void ShellSort(int R[],int N,int d[],int t);
void Print(int R[],int N);
int main()
{
int *R,N,i,*d,t; /*数据存储在R[1]...R[N]中*/
cin>>N;
R=new int[N+1];
for(i=1; i<=N; i++)
cin>>R[i];
Print(R,N);
cin>>t;
d=new int[t];
for(i=0; i<t; i++)
cin>>d[i];
ShellSort(R,N,d,t);
Print(R,N);
return 0;
}
void Print(int R[],int N)
{
int i;
cout<<R[1];
for (i=2; i<=N; i++)
cout<<","<<R[i];
cout<<endl;
}
void ShellSort(int R[],int N,int d[],int t)
{
for(int i=0;i<t;i++)
{//d[i]为增量
for(int j=1;j<=d[i];j++)//增量为几就有几个序列
{
for(int k=j;k<=N-d[i];k+=d[i]){//分好了每个序列,现在要用直接排序 //从后往前移动 主要是要想清楚分组的边界
int end=k;//最后的那个数
int tmp=R[end+d[i]];//待插入的数
while(end>=1){//数组从1开始放
if(tmp<R[end]){//交换
R[end+d[i]]=R[end];
end-=d[i];
}else break;
}
R[end+d[i]]=tmp;
}
}
Print(R,N);
}
}
如果看不懂中间两个循环的话,建议去补一下插入排序
记录一下做题,如果有更好的建议欢迎提出来呀!