本次笔记内容:
9.3.1 选择排序
9.3.2 堆排序

文章目录

  • 选择排序
  • 堆排序
    • 较为直接的算法
    • 改进后的算法

选择排序

void Selection_Sort(ElementType A[], int N)
{for (i = 0; i < N; i++){MinPosition = ScanForMin(A, i, N - 1);// 从A[i]到A[N-1]中找最小元,并将其位置赋给MinPositionSwap(A[i], A[MinPosition]);// 将未排序部分的最小元换到有序部分的最后位置}
}

顶多进行N-1次排序,但瓶颈在于ScanForMin(),是T=Θ(N2)T=\Theta (N^2)T=Θ(N2)。因此,如果能快速找到最小元,将对效率有较高提升。

堆排序

使用堆提升排序效率。

较为直接的算法

void Heap_Sort(ElementType A[], int N)
{BuildHeap(A); // O(N)for (i = 0; i < N; i++)TmpA[i] = DeleteMin(A); // O(logN)for (i = 0; i < N; i++)A[i] = TmpA[i]; // O(N)
}

虽然降低了时间复杂度,为T(N)=O(Nlog⁡2N)T(N)=O(N \log_2N)T(N)=O(Nlog2​N),但需要额外的O(N)O(N)O(N)的空间存储堆,并且复制元素需要时间。

改进后的算法

如上图,在最大堆中,将根结点放在最远(索引最大)的位置,并且以后不看这个位置(堆的规模-1),重复进行此步骤。之后,排序便完成了(按着索引的顺序排序的)。

要注意,在排序中,不需要哨兵,从0处开始存储。

void Heap_Sort(ElementType A[],int N))
{for (i = N / 2; i >= 0; i--) // BuildHeapPercDown(A, i, N);for (i = N - 1; i > 0; i--){Swap(&A[0], &A[i]); // DeleteMaxPercDown(A, 0, 1);}
}

定理:堆排序处理N个不同元素的随机排列的平均比较次数的2Nlog⁡2N−O(Nlog⁡2(log⁡2N))2N \log_2 N - O(N \log_2 (\log_2 N) )2Nlog2​N−O(Nlog2​(log2​N))

虽然堆排序给出最佳平均时间复杂度,但是实际效果不如用Sedgewick增量序列的希尔排序。

【数据结构笔记34】C实现:选择排序与堆排序相关推荐

  1. 算法图解第二章笔记与习题(选择排序)

    算法图解第二章笔记与习题(选择排序) 文章目录 算法图解第二章笔记与习题(选择排序) 2.2 数组和链表 2.2.1 链表 2.2.2 数组 2.2.3 数组和链表的读取.插入和删除操作的时间复杂度 ...

  2. 数据结构—排序算法总结(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、合并排序、计数排序)

    *排序 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 稳定性 在待排序的数组中,如果出现多个相同的关键字,例如:98751555512,中出现重复的数字,在 ...

  3. 数据结构之选择排序:堆排序

    选择排序:堆排序 思维导图: 堆的概念: 堆的初始化: 堆排序的算法思想: 堆排序代码实现: 堆排序的插入: 堆排序的删除: 堆排序的性能: 思维导图: 堆的概念: 根>=左右孩子节点的顺序存储 ...

  4. 10种排序算法比较(直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、折半插入排序、2路插入排序)

    本文(所有排序算法代码+综合比较代码)链接:https://download.csdn.net/download/qq_39932172/11217572 一.比较目的: 由于<数据结构> ...

  5. 八大排序:冒泡排序、插入排序、希尔排序、选择排序、堆排序、归并排序、快速排序、基数排序

    [前言] 所有代码段都以升序为例,数组下标从0开始.排序的稳定性即:任意两个相等的数据,排序前后的相对位置不发生变化. [冒泡排序(Bubble Sort)] 它重复地访问过要排序的元素序列,依次比较 ...

  6. java中的排序算法——简单选择排序,树形选择排序与堆排序(一)

    package com.sort; /**  * 选择排序:  * 简单选择排序,树形选择排序与堆排序  *   */ public class SelecSortDemo { /** * ----- ...

  7. 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)...

    不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...

  8. 排序算法之选择排序(简单选择排序、堆排序)

    选择排序(简单选择排序.堆排序) 选择排序 简单选择排序 概念 算法实现 堆排序 概念 算法实现 后续 选择排序 选择排序的基本思想是:每一趟在待排序元素中选取关键字最小(或最大)的元素加入有序子序列 ...

  9. 数据结构与算法笔记(七)—— 选择排序

    什么是选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 算法步骤:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大 ...

最新文章

  1. 传智播客C/C++各种开发环境搭建视频工具文档免费教程
  2. 深入思考编译原理之 理解执行过程和编译过程
  3. json java的set函数,JsonConfig的jsonConfig.setExcludes的用法
  4. python3字符串属性(二)
  5. Eclipse关联JavaDoc
  6. 如何修改Struts2 FiledError样式
  7. 经过七年演进,Serverless流行起来了吗?
  8. CLion开发,运行报错后问题排查
  9. Office 2010下载安装
  10. 小米mix2s主板电路图
  11. mysql创建用户代码,MySQL创建用户与受权
  12. android item弹出popupwindow recycleview_PopupWindow+RecyclerView实现上下滑动框功能
  13. 原力计划第5周榜单揭晓!
  14. js 声明——有无var的区别
  15. 常用荧光染料的激发和发射波长
  16. 适用各大电商平台的商品主图设计模板!
  17. 科目三考试项目分类评判标准
  18. win11找不到录音机
  19. 学 Python 爬虫,你可以研究下 GoPUP, 一个用于学术研究的小爬虫库
  20. Android上又双叒冒出新的恶意软件:ROOT近800万台设备、狂发广告骗推广费

热门文章

  1. mysql oracle 区别吗_MySQL与Oracle的区别(-)
  2. oracle Plsql 执行update或者delete时卡死问题解决办法
  3. 【问题待解决】自定义控件设计界面报错,编译运行正常
  4. Spring Boot 2.X 如何优雅的解决跨域问题?
  5. 升级glic: 解决“libc.so.6: version ‘GLIBC_2.14‘ not found“问题
  6. 了解REST:动词,错误代码和身份验证
  7. win10 pin码如何设置
  8. Redis集群的搭建与主从复制,redis-cluster
  9. 自定义js 延时函数调用延时函sleep();
  10. vmware提示虚拟机似乎正在使用中