c语言排序算法之七(希尔排序)

devtools/2024/9/23 18:43:51/

前言

以下内容是被验证可以有效理解希尔排序,代码也较容易理解。如果你发现还有很多需要增加的,欢迎留言。

为什么要单独写算法>排序算法这一系列,看过一些贴子普遍篇幅较长。看完还依旧云里雾里,难以直观理解原理及整个过程。代码永远是基于理解的基础上才能实现。

执行过程能动画展示需方便清晰,同时需具备单步调试,方便没理解的可以回看。

语言比较推荐c语言,高级语言库函数较多,人都有惰性思维,将自己置身于环境中训练也是至关重要。

感悟心得:初级阶段学习算法,在理解的基础上每天徒手2种算法。每种算法都是一种不同的思维方式,相信第一阶段坚持30天后会有不一样的收获。

实现原理

希尔排序(Shell Sort)是一种插入排序的改进版本,其核心思想是首先将待排序的数组按照一定的间隔分组,对每组数据进行插入排序,然后逐渐减小间隔,重复分组和排序的过程,直到间隔为1,此时整个数组被视为一个组,进行最后一次插入排序。希尔排序的增量序列选择是数学上的一个难题,但希尔最初建议的增量序列是{n/2, (n/2)/2, ..., 1},其中n是数组的长度。

希尔排序的详细过程可以概括为以下几个步骤:

  1. 初始化增量:选择一个初始增量gap,通常为数组长度的一半。如果数组长度为奇数,向下取整。

  2. 分组排序:将数组分为多个子组,每个子组包含间隔为gap的元素。对每个子组使用直接插入排序进行排序。

  3. 减小增量:减小增量gap,通常为gap/2。重复步骤2,直到增量减至1。

  4. 最终排序:当增量为1时,整个数组被视为一个组,进行最后一次直接插入排序。

希尔排序的时间复杂度分析较为困难,因为它依赖于增量序列的具体形式。在特定情况下,希尔排序的时间复杂度约为O(n^1.3),在最坏情况下可能达到O(n^2)。希尔排序的空间复杂度为O(1),因为它只需常数个额外空间来存储增量和索引。希尔排序是不稳定的算法>排序算法,因为相同的关键字可能会在分组过程中改变它们的相对次序。

动画展示过程(Shell Sort)

Comparison Sorting Visualization

具体代码实现

#include <stdio.h>void shell_sort(int arr[], int len) {int i, j, gap;for (gap = len / 2; gap > 0; gap /= 2) {for (i = gap; i < len; i++) {int temp = arr[i];for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {arr[j] = arr[j - gap];}arr[j] = temp;}}
}int main() {int arr[] = {12, 34, 54, 2, 3, 4, 34, 56, 7, 9, 10, 12};int len = (int) sizeof(arr) / sizeof(*arr);shell_sort(arr, len);for (int i = 0; i < len; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

Q1:

A1:


http://www.ppmy.cn/devtools/38449.html

相关文章

保姆级零基础微调大模型(LLaMa-Factory,多卡版)

此处非常感谢https://github.com/hiyouga/LLaMA-Factory这个项目。 看到网上的教程很多都是教如何用webui来微调的,这里出一期命令行多卡微调教程~ 1. 模型准备 模型下载比较方便的方法: 1. modelscope社区(首选,速度很高,并且很多需要申请的模型都有)注意要选择代码…

模型剪枝——Linear Combination Approximation of Feature for Channel Pruning

线性逼近剪枝代码实现见文末 论文地址:CVPR 2022 Open Access Repositoryhttps://openaccess.thecvf.com/content/CVPR2022W/ECV/html/Joo_Linear_Combination_Approximation_of_Feature_for_Channel_Pruning_CVPRW_2022_paper.html 1.概述 传统的剪枝技术主要集中在去除对…

TestString----shuffleString

package com.test;import java.util.Random; import java.util.Scanner;public class String01 {//键盘输入任意字符串&#xff0c;打乱里面内容//1.键盘输入任意字符串//2.打乱里面内容//修改里面内容//1.subString//2.变成字符数组//3.0索引开始&#xff0c;跟一个随机索引进…

Java中ArrayList、LinkedList与Vector的区别

ArrayList ArrayList是一个可以改变大小的数组&#xff0c;当更多的元素加入到ArrayList中时&#xff0c;其大小将会动态的增长&#xff0c;内部的元素可以直接通过get与set方法进行访问&#xff0c;因为ArrayList本质上就是一个数组。 LinkedList LinkedList是一个双向链表…

华为数据之道第一部分导读

目录 导读 第一部分 序 第1章 数据驱动的企业数字化转型 非数字原生企业的数字化转型挑战 业态特征&#xff1a;产业链条长、多业态并存 运营环境&#xff1a;数据交互和共享风险高 IT建设过程&#xff1a;数据复杂、历史包袱重 数据质量&#xff1a;数据可信和一致化…

python基础---函数以及常用变量

函数及变量 函数 使用def关键字 在参数名前面的*表示args是一个可变参数 def add(*args):total 0for val in args:total valreturn total# 在调用add函数时可以传入0个或多个参数 print(add()) print(add(1)) print(add(1, 2)) print(add(1, 2, 3)) print(add(1, 3, 5, 7…

QT 设置窗口不透明度

在窗口作为子窗口时&#xff0c;setWindowOpacity设置窗口的不透明度可能会失效。 QGraphicsOpacityEffect *opacityEffect new QGraphicsOpacityEffect(this); opacityEffect->setOpacity(1.0); this->setGraphicsEffect(opacityEffect);// 创建属性动画对象&#xff…

模方已经安装了3dmax,也装了插件,为什么一直显示没有插件?

答&#xff1a;主要是联动2018版本&#xff0c;然后插件在模方安装时候&#xff0c;会有选项自动安装联动插件&#xff0c;SketchUp&#xff08;建议版本为2019&#xff09;&#xff0c;3dsMax&#xff08;建议版本为2018&#xff09; 模方是一款针对实景三维模型的冗余碎片、…