当前位置: 首页 > news >正文

C语言实现希尔排序和堆排序

目录

1.希尔排序

1.1基本思想

1.2希尔排序的特性总结

1.3希尔排序算法的实现

2.堆排序

2.1基本思想

2.2堆排序的特性总结

2.3堆排序算法的实现


1.希尔排序

1.1基本思想

        希尔排序法的基本思想是:先选定一个整数(gap),把待排序文件中所有记录分成gap个组,所有距离为gap的记录分在同一组内,并对每一gap组内的记录进行插入排序。然后减小gap,重复上述分组和排序的工作。当到达gap=1时,所有记录在统一组内排好序。gap为几,则就分为几组数据,则每组数据的间隔为gap。

1.2希尔排序的特性总结

(1)希尔排序是对直接插入排序的优化(一定程度上防止了逆序的情况)。

(2)当gap>1时都是预排序,目的时让数组更接近于有序。当gap==1时,数组已经接近有序的了,这样就会排的很快。整体而言,可以达到优化的效果。

(3)希尔排序的时间复杂度不好计算,因为gap的取值方式很多,导致很难去计算,因此在好多书中给出的希尔排序的时间复杂度都不固定。如果gap按照gap = (gap / 3) + 1的方式来取值,这里给出一个大概的时间复杂度为O(N^1.3)

(4)稳定性:不稳定。

1.3希尔排序算法的实现

//方法1,一组一组排
void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){//直接插入排序就是当gap为1时候的希尔排序//单趟gap = gap / 3 + 1;for (int j = 0; j < gap; j++)//全部数据预排序,一组一组来{//每一个gap组内的元素排序for (int i = j; i < n - gap; i += gap){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}}
}
//方法2    多组并着排
void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){gap = gap / 3 + 1; //+1保证最后一次是1for (int i = 0; i < n - gap; ++i) //多组并着走{int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}

        虽然上述两种方法循环的层数不一样,但是整体的效率是相同的。 

2.堆排序

2.1基本思想

        堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

2.2堆排序的特性总结

(1)堆排序使用堆来选数,效率高了很多。

(2)时间复杂度:O(NlogN)。

(3)空间复杂度: O(1)。

(4)稳定性:不稳定。

2.3堆排序算法的实现

void AdjustDwon(int* a, int n, int root) //向下调整算法用于建大堆,n为数组大小
{int parent = root;int child = parent * 2 + 1;while (child < n){if (a[child + 1] > a[child] && child + 1 < n) //找小的孩子{child = child + 1;}{if (a[parent] < a[child]){Swap(&a[parent], &a[child]);parent = child;child = parent * 2 + 1;}else{break;}}}
}
void HeapSort(int* a, int n)
{//建大堆for (int i = ((n - 1) - 1) / 2; i >= 0; i--) //从最后一个非叶子节点到根节点建堆{AdjustDwon(a, n, i);}for (int i = n - 1; i >= 0; i--) //每次建堆后把堆顶元素(最大的元素)放在最后位置,重新建堆{Swap(&a[0], &a[i]);AdjustDwon(a, i, 0);}
}

 

       

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CDH清理磁盘空间完全攻略和完整实现自动化脚本(大数据清除日志)
  • 【Unity】3D功能开发入门系列(一)
  • 【课程系列07】某乎AI大模型全栈工程师-第7期
  • 手写chatGPT——fetch解析text/event-stream会话流并逐字回显到页面——js技能提升
  • 【C++BFS算法】2998. 使 X 和 Y 相等的最少操作次数
  • Redis作为缓存,如何与MySql的数据进行同步?
  • 7 postgresql 10版本 分区表使用场景、创建删除、注意事项
  • 熟悉简单测试面经
  • 代码随想录第二十一天|动态规划(5)
  • 3.2.2 最短路径 堆优化版Djkstra算法
  • 快速解密哈希算法利器Hasher:解密MD5、SHA256、SHA512、RIPEMD160等最佳工具
  • ChatTTS文本转语音本地部署结合内网穿透实现远程使用生成AI音频
  • sql注入安全作业
  • LearnOpenGL-入门章节学习笔记
  • C语言程序设计-[5] 输入输出语句
  • Git学习与使用心得(1)—— 初始化
  • If…else
  • jdbc就是这么简单
  • JS学习笔记——闭包
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • ReactNative开发常用的三方模块
  • Shadow DOM 内部构造及如何构建独立组件
  • windows下使用nginx调试简介
  • 两列自适应布局方案整理
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 微信小程序开发问题汇总
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 学习使用ExpressJS 4.0中的新Router
  • gunicorn工作原理
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #include
  • #Linux(帮助手册)
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (poj1.3.2)1791(构造法模拟)
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (ZT)出版业改革:该死的死,该生的生
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十二)Flink Table API
  • (原创)可支持最大高度的NestedScrollView
  • ***通过什么方式***网吧
  • .bat批处理(六):替换字符串中匹配的子串
  • .Net 知识杂记
  • .Net6使用WebSocket与前端进行通信
  • .NET构架之我见
  • .net开发日常笔记(持续更新)
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成