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

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

  2. 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值