本文将介绍三种排序算法--插入排序,希尔排序,堆排序。本文所有例子都是使用升序

一.插入排序

算法思想

维护一个有序数组,将要插入的数据与有序数组自最后一个元素直到合适位置的数一一比较。

eg: 有序数组:1,3,5,6,7   现在待插入数据为2,那么他将会和7,6,5,3,依次作比较,当带插入数据小于有序数组最后的元素大小,则将该元素后移,直到待插入元素找到合适位置为止。

代码实现

void InsertSort(int* a, int size)
{assert(a);for (int i = 0; i < size - 1; ++i){int end = i;                                 //标识有序数组的最后一位int tmp = a[end + 1];while (end >= 0 && tmp < a[end]){a[end + 1] = a[end];                     //待插入数据比有序数组的最后一个数小,将有序数组最后一位向后移位--end;}a[end + 1] = tmp;}
}

总结

    1.插入排序可以认为是间距为1的插入算法,说这个是为了待会儿更好的理解希尔排序。

2.插入排序的时间复杂度为O(n^2);

3.插入排序的空间复杂度为O(1);

4.具有稳定性

排序算法的稳定性是指,经过排序算法排序的相同元素的相对位置不会发生改变。

二.希尔排序

算法思想

希尔排序可以认为是插入排序的增强版,因为,他加入了一个预排的过程,即在实现间距为1的插入算法之前,他已经预先将间距为gap(gap一直减减直到>0)的数组排列过了。所以,当进行gap = 1的插入排序之前使得待排序数组已经高度接近有序,使得这次进行的gap = 1的排序的时间复杂度,可以小于O(N^2)(gap = 1的插入排序,最好情况的时间复杂度为O(1),前面的预排过程正是出于这个目的)。

代码实现

//希尔排序
void ShellSort(int* a,size_t size)
{assert(a);int gap = size / 2;while (gap > 0){for (int i = 0; i < size - gap; ++i){int end = i;                                int tmp = a[end + gap];while (end >= 0 && tmp < a[end]){a[end + gap] = a[end];                    end -= gap;}a[end + gap] = tmp;}--gap;}
}

总结

 上图为gap = 5 的时候的预排效果图

1.希尔排序预排的思想和插入排序的思想是一致的,只是,他把原数组分成不同的区间。

2.希尔排序的时间复杂度为O(N^2),空间复杂度为O(1);

3,具有不稳定性

三.堆排序

算法思想

代码实现

void AdjustDown(int* a, size_t size, int parent)
{assert(a);int child = parent * 2 + 1;while (child<size){if (child+1<size && a[child] < a[child + 1])++child;if (a[parent] < a[child]){swap(a[parent], a[child]);parent = child;child = parent * 2 + 1;}else{break;}}
}
void HeapSort(int* a,size_t size)
{assert(a);//建堆for (int i = (size - 2) / 2; i >= 0; --i)  //从第一个非叶子节点开始调{AdjustDown(a, size, i);}for (size_t i = 0; i < size; ++i){swap(a[0], a[size - 1 - i]);AdjustDown(a, size - i - 1, 0);}
}

总结

1.时间复杂度为O(N*lgN),空间复杂度为O(1);

2.具有不稳定性

以上就是本人在学习过程中的一些经验总结。当然,本人能力有限,难免会有纰漏,希望大家可以指正。

转载于:https://blog.51cto.com/10799170/1782078

插入排序,希尔排序,堆排序相关推荐

  1. 直接插入排序 希尔排序 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 基数排序的算法分析和具体实现 ...

    排序分为内部排序和外部排序 内部排序是把待排数据元素全部调入内存中进行的排序. 外部排序是因数量太大,把数据元素分批导入内存,排好序后再分批导出到磁盘和磁带外存介质上的排序方法. 比较排序算法优劣的标 ...

  2. 【排序算法】冒泡排序|选择排序|插入排序|希尔排序

    文章目录 冒泡排序 选择排序 插入排序 希尔排序 冒泡排序   第一个元素开始向第二个元素比较,若大于则交换位置,不大于则不动.然后第二个元素和第三个元素比较,再然后第三个元素和第四个元素比较-一直比 ...

  3. 数据结构第16周 :( 希尔排序+ 堆排序 + 快速排序 )

    目录 希尔排序 堆排序 快速排序 希尔排序 [问题描述]给出一组数据,请用希尔排序将其按照从小到大的顺序排列好. [输入形式]原始数据,以0作为输入的结束:第二行是增量的值,都只有3个. [输出形式] ...

  4. 插入排序(折半查找优化插入排序||希尔排序) _清风明月

    插入排序:插入排序分为三个步骤: 1. 找位置.(序列可分为两个部分,第一个部分是有序序列,其二是非有序序列.当为有序序列时,查找可以改进为折半查找,优化算法速度.) 2. 移动. 3. 插入.查找的 ...

  5. 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...

  6. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

  7. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  8. 【八大排序详解~C语言版】直接插入排序-希尔排序- 直接选择排序-堆排序-冒泡排序-快速排序-归并排序-计数排序

    八大排序 1.直接插入排序 2.希尔排序 3.直接选择排序 直接选择排序改进 4.堆排序 1.建堆 2.利用堆删除思想来进行排序 5.冒泡排序 6.快速排序 递归实现 非递归实现 7.归并排序 递归实 ...

  9. 七大排序算法—图文详解(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)

    作者:渴望力量的土狗 博客主页:渴望力量的土狗的博客主页 专栏:数据结构与算法 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客网 点击免费注册和我一起刷题吧 目录 插入排序: ...

  10. 数据结构:直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排序

    一.什么是排序 排序就是将一组杂乱无章的数据按照一定的次序组织起来,此次序可以是升序也可以是降序 二.为什么需要进行排序 为了满足一些需求,比如在比较学生的成绩时,我们就需要给所有学生的成绩排一个顺序 ...

最新文章

  1. <文献阅读>用转移熵通过微阵列的时间序列推断基因调控网络(inferring gene regulatory networks from microarray time series data
  2. 蚁群算法和简要matlab来源
  3. mysql5.7.25my.ini_mysql5.7 没有my.ini 的解决办法
  4. java 进程同步代码_java 实现进程间的同步(源代码)
  5. ubuntu 16.04常用命令
  6. spring整合web
  7. Hadoop单点安装(伪分布式)
  8. Mybatis Plus 连表操作及分页
  9. 《计算机组成原理》数据传送类指令不包括( ),兰大《计算机组成原理》20秋平时作业1【标准答案】...
  10. 鸿蒙系统下载地址_华为鸿蒙代码全开源,老规矩:先跑个Hello World....
  11. 局域网连接MYSQL8.0报错1251的解决记录
  12. 怎么样把设备管理器弄到计算机处,电脑设备管理器要连接上蓝牙的方法
  13. html前端论文参考文献,web前端论文参考文献论文
  14. js的Base64编码
  15. 简信CRM:手机CRM软件的应用好处有哪些?
  16. 全民一起VBA提高篇 专题1 第二回 变体终非万全策,数字要分长短型
  17. 北航学堂Android客户端Beta阶段发布说明
  18. arcgis发布服务后符号字体丢失解决办法
  19. 数字ic设计_总结复习
  20. 计算机辅助技术英语,电子计算机辅助技术(CAD)

热门文章

  1. php 开发restful api,用PHP创建RESTful API?
  2. ai 临摹图片换背景_AI临摹绘制插画图片
  3. python3 zipfile_python3中zipfile模块的常用方法
  4. python 执行vba脚本_用python批量执行VBA代码
  5. 电脑画画软件_手绘、板绘、还有用pad画画都有啥区别?
  6. python flask 部署_如何进行Python Flask项目的部署?
  7. 加密解密php,PHP实现的加密解密处理类
  8. 【基础知识】如何在word中粘贴出漂亮整洁的代码
  9. 【js】绑定事件的两种方法
  10. JavaScript 数据类型转换