0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅谈希尔排序算法思想以及如何实现

Android编程精选 来源:编程学习总站 作者:写代码的牛顿 2021-06-30 10:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

01

希尔排序算法思想

希尔排序也是一种插入排序,是简单插入排序改进后的一个更高效版本,同时也是首批突破O(n^2)算法之一。

希尔排序算法思想:希尔排序是按照下标增量进行分组,对每组使用插入排序算法进行排序,随着增量减少,每组包含的关键字越来越多,增量减到1时,整个序列被分为一组,算法终止。

我们以增序排序为例,希尔排序基本步骤:选择初始增量gap = length / 2,缩小增量继续以gap = gap / 2的方式进行,直到增量gap = 1为止,增量的每次变化都会将原始序列划分为若干组,分别对每一组进行插入排序。

每一次通过增量划分组进行插入排序宏观上小的数移到了前面,大的数移到了后面,最后增量gap = 1进行插入排序后就是最终的有序序列。本文会以图解的方式详细介绍希尔排序算法的整个工作过程。

02

希尔排序算法实现

希尔排序完整源码如下:

//插入排序 void insert_sort(int *arr, int length, int start, int gap){ if(arr == NULL || length 《= 0 || start 《 0 || gap 《= 0){ return; } int i = 0, j = 0; int value = 0; for(i = start; i 《 length - gap; i += gap){ value = arr[i + gap]; for(j = i; j 》= start; j -= gap){ if(value 《 arr[j]){ arr[j + gap] = arr[j]; }else{ break; } } arr[j + gap] = value; } } //希尔排序 void shell_sort(int *arr, int length){ if(arr == NULL || length 《= 0){ return; } int gap = 0, start = 0; int count = 0; for(gap = length / 2; gap 》 0; gap /= 2){ start = 0; for(count = 0; count 《 length / gap; count++){ insert_sort(arr, length, start, gap); start++; } } }

现在写一个小程序验证算法的正确性,代码如下:

#include 《stdio.h》 #include “shell_sort.h” int main() { int i = 0; printf(“希尔排序结果 ”); int arr[7] = {8, 23, 64, 12, 0, 5, 6}; shell_sort(arr, 7); for(i = 0; i 《 7; i++){ printf(“%d ”, arr[i]); } printf(“ ”); return 0; }

编译运行输出如下:

希尔排序结果 0 5 6 8 12 23 64

算法完全正确!

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 源码
    +关注

    关注

    8

    文章

    689

    浏览量

    31558
  • 编译
    +关注

    关注

    0

    文章

    697

    浏览量

    35340

原文标题:数据结构与算法篇-希尔排序

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ADM6819/ADM6820:简单电源排序器的技术剖析与应用指南

    ,为多电源系统的设计提供了有效的解决方案。下面我们就来详细了解这两款器件。 文件下载: ADM6819.pdf 一、特性亮点 1. 单芯片实现双电源排序 ADM6819/ADM6820能够在单芯片上实现
    的头像 发表于 02-28 14:25 321次阅读

    ADM1066:多功能电源监控与排序芯片的深度解析

    的解决方案。本文将深入探讨ADM1066的特性、工作原理、应用场景以及使用方法,帮助电子工程师更好地理解和应用这款芯片。 文件下载: ADM1066.pdf 芯片特性 全面的电源监控与排序 ADM1066能够对多达10路电源进行监控和
    的头像 发表于 02-28 14:05 274次阅读

    LTC2937:六通道电源排序器与电压监控器的设计与应用

    功能强大的电源管理 IC,具备时间和事件驱动的排序功能,以及高精度的欠压(UV)和过压(OV)监控能力。它能
    的头像 发表于 02-28 11:15 376次阅读

    探索LM3880:三轨简单电源排序器的卓越性能与应用

    提供了一种简洁而高效的解决方案。 文件下载: lm3880.pdf 一、LM3880的特性亮点 1. 多轨排序能力 LM3880可以通过单个输入信号对三个电压轨进行排序,而且还能轻松级联多达三个设备,实现对九个电压轨的
    的头像 发表于 02-26 17:20 692次阅读

    德州仪器UCD9090A:10轨电源排序与监控的理想之选

    问题提供了强大而灵活的解决方案。本文将深入探讨UCD9090A的特性、应用、详细功能以及设计要点。 文件下载: ucd9090a.pdf 一、UCD9090A的特性亮点 1. 多轨监控与排序
    的头像 发表于 02-26 16:25 246次阅读

    MAX16050/MAX16051:具备反向排序功能的电压监控与排序电路

    MAX16050/MAX16051:具备反向排序功能的电压监控与排序电路 在电子系统设计中,对电源电压的精确监控和有序控制至关重要。Maxim Integrated推出的MAX16050
    的头像 发表于 01-31 17:15 1014次阅读

    单片机常用的14个C语言算法分享

    算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化
    发表于 01-29 06:59

    C语言插入排序算法和代码

    插入排序排序算法的一种,它不改变原有的序列(数组),而是创建一个新的序列,在新序列上进行操作。   这里以从小到大排序为例进行讲解。   基本
    发表于 01-15 06:44

    C语言增量式PID的通用算法

    式PID算法,可以直接使用,不用更改什么东西,顶多改一下初始化时候的几个参数限制范围。 该算法思想是设计一个PID控制器类,使用的时候直接实例化一个PID对象即可,也可以实例化多个,每个都是独立
    发表于 01-14 08:28

    光纤线芯都是按照什么颜色排序

    多次有朋友留言问到,光纤熔接颜色如何排序,这个在实际应用中还是比较多的,那么今天我们就不讲原理了,直接用图文简单明了讲光纤熔接色谱,大家可以了解下。 一、常规排序 1、4芯的排序:蓝、橙、绿、棕
    的头像 发表于 12-19 11:02 2588次阅读

    C语言的常见算法

    # C语言常见算法 C语言中常用的算法可以分为以下几大类: ## 1. 排序算法 ### 冒泡排序 (Bubble Sort) ```
    发表于 11-24 08:29

    SM4算法实现分享(一)算法原理

    ,Xi、Yi、rki为字,i=0,1,2,…,31。则本算法的加密实现为: 本算法的解密实现与加密实现结构是相同的,不同的只是提供的轮
    发表于 10-30 08:10

    复杂的软件算法硬件IP核的实现

    具体方法与步骤 通过 C 语言实现软件算法,并验证了算法的有效性以后,就可以进行算法的 HDL 转化工作了。通过使用 Altium Designer 的 CHC 编译器(C to H
    发表于 10-30 07:02

    e203除法器算法改进(一)

    e203内部除法操作使用加减交替迭代法进行运算,除几个特殊运算外,正常的除法操作需要33个周期才能输出运算结果,极大程度地影响了系统的性能。我们对e203的除法器进行了新的算法实现并改进。目前高性能
    发表于 10-22 07:13

    基于FPGA实现FOC算法之PWM模块设计

    哈喽,大家好,从今天开始正式带领大家从零到一,在FPGA平台上实现FOC算法,整个算法的框架如下图所示,如果大家对算法的原理不是特别清楚的话,可以先去百度上学习一下,本教程着重介绍
    的头像 发表于 07-17 15:21 3796次阅读
    基于FPGA<b class='flag-5'>实现</b>FOC<b class='flag-5'>算法</b>之PWM模块设计