各种排序算法总结_第1页
各种排序算法总结_第2页
各种排序算法总结_第3页
各种排序算法总结_第4页
各种排序算法总结_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

各种排序算法总结各种排序算法总结 排序算法是最基本最常用的算法 不同的排序算法在不同的场景或应用中会有 不同的表现 我们需要对各种排序算法熟练才能将它们应用到实际当中 才能 更好地发挥它们的优势 今天 来总结下各种排序算法 下面这个表格总结了各种排序算法的复杂度与稳定性 各种排序算法复杂度比较 png 冒泡排序冒泡排序 冒泡排序可谓是最经典的排序算法了 它是基于比较的排序算法 时间复杂度 为 O n 2 其优点是实现简单 n 较小时性能较好 算法原理 相邻的数据进行两两比较 小数放在前面 大数放在后面 这样一趟下 来 最小的数就被排在了第一位 第二趟也是如此 如此类推 直到所 有的数据排序完成 c 代码实现 1 void bubble sort int arr int len 2 3 for int i 0 i i j 6 7 if arr j arr j 1 8 9 int temp arr j 10 arr j arr j 1 11 arr j 1 temp 12 13 14 15 选择排序选择排序 算法原理 先在未排序序列中找到最小 大 元素 存放到排序序列的起始位置 然后 再从剩余未排序元素中继续寻找最小 大 元素 然后放到已排 序序列的末尾 以此类推 直到所有元素均排序完毕 c 代码实现 1 void select sort int arr int len 2 3 for int i 0 i len i 4 5 int index i 6 for int j i 1 j len j 7 8 if arr j arr index 9 index j 10 11 if index i 12 13 int temp arr i 14 arr i arr index 15 arr index temp 16 17 18 插入排序插入排序 算法原理 将数据分为两部分 有序部分与无序部分 一开始有序部分包含第 1 个 元素 依次将无序的元素插入到有序部分 直到所有元素有序 插入排 序又分为直接插入排序 二分插入排序 链表插入等 这里只讨论直接 插入排序 它是稳定的排序算法 时间复杂度为 O n 2 c 代码实现 1 void insert sort int arr int len 2 3 for int i 1 i 1 10 j 11 12 arr j 1 k 13 14 快速排序快速排序 算法原理 快速排序是目前在实践中非常高效的一种排序算法 它不是稳定的排序 算法 平均时间复杂度为 O nlogn 最差情况下复杂度为 O n 2 它的 基本思想是 通过一趟排序将要排序的数据分割成独立的两部分 其中 一部分的所有数据都比另外一部分的所有数据都要小 然后再按此方法 对这两部分数据分别进行快速排序 整个排序过程可以递归进行 以此 达到整个数据变成有序序列 c 代码实现 1 void quick sort int arr int left int right 2 3 if left right 4 5 int i left j right target arr left 6 while i j 7 8 while i target 9 j 10 if i j 11 arr i arr j 12 13 while i j 15 if i j 16 arr j arr i 17 18 arr i target 19 quick sort arr left i 1 20 quick sort arr i 1 right 21 22 归并排序归并排序 算法原理 归并排序具体工作原理如下 假设序列共有 n 个元素 o将序列每相邻两个数字进行归并操作 merge 形成 floor n 2 个序列 排序后每个序列包含两个元素 o将上述序列再次归并 形成 floor n 4 个序列 每个序列包含四 个元素 o重复步骤 2 直到所有元素排序完毕 归并排序是稳定的排序算法 其时间复杂度为 O nlogn 如果是 使用链表的实现的话 空间复杂度可以达到 O 1 但如果是使用 数组来存储数据的话 在归并的过程中 需要临时空间来存储归 并好的数据 所以空间复杂度为 O n c 代码实现 1 void merge int arr int temp arr int start inde x int mid index int end index 2 3 int i start index j mid index 1 4 int k 0 5 while i mid index 1 9 else 10 temp arr k arr i 11 12 while i mid index 1 13 14 temp arr k arr i 15 16 while j end index 1 17 temp arr k arr j 18 19 for i 0 j start index j end index 1 i j 20 arr j temp arr i 21 22 23 void merge sort int arr int temp arr int sta rt index int end index 24 25 if start index end index 26 27 int mid index start index end index 2 28 merge sort arr temp arr start index mid index 29 merge sort arr temp arr mid index 1 e nd index 30 merge arr temp arr start index mid inde x end index 31 32 堆排序堆排序 二叉堆二叉堆 二叉堆是完全二叉树或者近似完全二叉树 满足两个特性 父结点的键值总是大于或等于 小于或等于 任何一个子节点的键值 每个结点的左子树和右子树都是一个二叉堆 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆 当父结点 的键值总是小于或等于任何一个子节点的键值时为最小堆 一般二叉树简称为 堆 堆的存储堆的存储 一般都是数组来存储堆 i 结点的父结点下标就为 i 1 2 它的左右子 结点下标分别为 2 i 1 和 2 i 2 如第 0 个结点左右子结点下标分别 为 1 和 2 存储结构如图所示 堆结构 png 堆排序原理堆排序原理 堆排序的时间复杂度为 O nlogn 算法原理 以最大堆为例 o先将初始数据 R 1 n 建成一个最大堆 此堆为初始的无序区 o再将关键字最大的记录 R 1 即堆顶 和无序区的最后一个记录 R n 交换 由此得到新的无序区 R 1 n 1 和有序区 R n 且满 足 R 1 n 1 keys R n key o由于交换后新的根 R 1 可能违反堆性质 故应将当前无序区 R 1 n 1 调整为堆 o重复 2 3 步骤 直到无序区只有一个元素为止 c 代码实现 1 2 将数组 arr 构建大根堆 3 param arr 待调整的数组 4 param i 待调整的数组元素的下标 5 param len 数组的长度 6 7 void heap adjust int arr int i int len 8 9 int child 10 int temp 11 12 for 2 i 1 len i child 13 14 child 2 i 1 子结点的位置 2 父 结点的位置 1 15 得到子结点中键值较大的结点 16 if child arr child 17 child 18 如果较大的子结点大于父结点那么把较大的子结点往上 移动 替换它的父结点 19 if arr i 0 i 38 39 heap adjust arr i len 40 41 42 for i len 1 i 0 i 43 44 将第 1 个元素与当前最后一个元素交换 保证当前的最 后一个位置的元素都是现在的这个序列中最大的 45 int temp arr 0 46 arr 0 arr i 47 arr i temp 48

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论