您的位置:首页 > 编程语言 > C语言/C++

排序算法的C++ && Python实现---希尔排序(缩小增量排序)

2017-04-27 10:43 537 查看
算法思想

希尔排序是在直接插入排序的基础上进行改进。直接插入排序时每次数据间间隔总为1,遍历整个序列,而希尔排序时每次数据间间隔分别为n/2、n/4、…、1,然后再对每一个分组数据进行直接插入排序,当间隔小于1时,表明排序完成。

C++代码(VS2012):

//打印排序结果函数
void Print(int a[],int n,int i=0)
{
//cout<<i<<endl;
cout<<"排序后的结果为:"<<endl;
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
//希尔排序(缩小增量排序),不稳定排序
void ShellInsertSort(int a[],int n,int dk)//函数输入参数---数组a存有待排序数据,n为数据个数,dk为间隔增量
{
for(int i=dk;i<n;i++)
{
if(a[i]<a[i-dk]){
int j=i-dk;                   //存坐标
int x=a[i];                   //哨兵,存参考值
a[i]=a[i-dk];                 //首先后移一个元素
while(x<a[j]){
a[j+dk]=a[j];
j-=dk;
}
a[j+dk]=x;
}
Print(a,n,i);
}
}
void ShellSort(int a[],int n)
{
int dk=n/2;
while(dk>=1)
{
ShellInsertSort(a,n,dk);
dk=dk/2;
}
}


3 Python代码(Python 2.7)

'''输出排序结果函数'''
def Print(ddata):
n=len(ddata)
for i in range(n):
print ddata[i],    #其中","为了不让其输出默认的换行符
'''插入排序---希尔排序'''
def ShellInsertSort(data,dk,n):
for i in range(dk,n):
if(data[i-dk]>data[i]):
j=i-dk
ShaoBing=data[i]
while(ShaoBing<data[j]):
data[j+dk]=data[j]
if(j<0 and (data[j]==data[j+dk])):  #由于Python列表有负索引,此处为了避免索引值
break
j-=dk
data[j+dk]=ShaoBing
return data
def ShellSort(data):
n=len(data)
dk=n/2
while(dk>=1):
ShellInsertSort(data,dk,n)
dk=dk/2
Print(data)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐