Shell Sort

Shell 排序算法严格来说基于插入排序思想,又称希尔排序或缩小增量排序.
Shell 排序的算法流程为:

  • 将 有 0 个元素的数组分成 n 2 \frac{n}{2} 2n 个数字序列第 1 个 数 据 和 第 ~ 2 + 1 个数据为一对 。
  • 一次循环使每一个序列对排好顺序。
  • 然后,再 变 为 ~ 4 个序列,再次排序。
  • 不断重复上述过程,随着序列减少最后变为 1 个
#include <iostream>
#include <cstdio>
#include <ctime>

const int SIZE = 10;                     // 数组大小

int main()
{
    void ShellSort(int *a, int len);
    int array[SIZE], i;
    srand(time(NULL));                 // 随机种子
    for (i=0;i<SIZE;i++)
    {
        array[i] = rand()/1000+10;     // 初始化数组
    }

    std::cout << "排序前的数组为:" << std::endl;
    for (i=0;i<SIZE;i++)
    {
        std::cout << array[i] << " ";
    }
    std::cout << std::endl;
    
    ShellSort(array, SIZE);

    std::cout << "排序后的数组为:" << std::endl;
    for (i=0;i<SIZE;i++)
    {
        std::cout << array[i] << " ";
    }
    std::cout << std::endl;

}

void ShellSort(int *a, int len)
{
    int i, j, h;
    int r, temp;
    int x = 0;
    for (r=len/2;r>=1;r/=2)
    {
        for (i=r;i<len;i++)
        {
            temp = a[i];
            j = i - r;
            while(j>=0 && temp<a[j])
            {
                a[j+r] = a[j];
                a[j] = temp;
                j -= r;
            }
        }
        x++;
        std::cout << "第" << x << "步排序结果: ";

        for (h=0;h<len;h++)
        {
            std::cout << a[h] << " ";            // 输出
        }
        std::cout << std::endl;
    }    
}

在这里插入图片描述

import numpy as np

def ShellSort(value):
    """
    Shell Sort/希尔排序/缩小增量排序
    :param value: random value
    :return: Sort value
    """
    gap = l = len(value)
    while (gap > 1):
        gap = gap // 2
        for i in range(l):
            for j in range(i, l-gap, gap):
                if value[j] > value[j+gap]:
                    value[j], value[j+gap] = value[j+gap], value[j]
    print("ShellSort: ")
    print(value)

def main():
    list = np.random.randint(100, size=10)
    print("排序前的数组为: ")
    print(list)
    ShellSort(list)

if __name__ == "__main__":
    main()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值