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

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
算法完全正确!


ARM处理器LPC2210在脑血氧监测仪中的应用
薄膜电容器生产工艺
小米6plus什么时候上市?小米6plus推迟发布:小米新机X1抢占先机?售价1999元
中国电科推出信创云一体机,四大核心技术助力七大场景落地
目前最值得入手的蓝牙耳机,便宜好用的蓝牙耳机推荐
浅谈希尔排序算法思想以及如何实现
芯闻3分钟:新材料巨头康得新陷假账风波 “千亿白马”或将陨落
自动驾驶技术不被信任 保险公司要求缴纳更高的保费
变电、配电、输电状态监控红外解决方案(输电篇)
小米能否撑住市值 奔向下一个十年
8155并口扩展实验
隧道ip网络广播系统
用LM7805做一个5V输出电源
全自动影像仪轻松测量IC针脚尺寸
MCU内核多元化发展 ARM核会不会一统天下?
华为P10怎么样?这样的华为P10,你会买吗?
对于中小企业网络安全给的一些战略意见
中国银联发布银联统一收银台及全新银联手机闪付
5G产业未来将会助力中国经济增长15.2亿元
大脑芯片与血脑屏障芯片结合的器官芯片,研究血脑屏障与大脑相互作用