插入排序

基本思想

插入排序的直观理解就是:整理扑克牌。当我们玩扑克牌时,常常把7放到6和9之间。插入排序的基本思想就是把待排序的记录按其大小逐个插入到已经排好序的有序序列中,知道所有的记录插入完为止,得到一个新的有序序列

直接插入排序

直接插入排序InsertSort()代码实现:

void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1; i++){int end = i;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}

直接插入排序的时间复杂度为O(N2),空间复杂度为O(1),是一种稳定的排序算法。

希尔排序

DL.Shell针对直接插入排序进行改进,得到希尔排序,又称缩小增量排序。希尔排序算法的基本思想是:先选定一个整数gap,把待排序文件中所有记录分成gap个组,所有距离为gap的记录分在同一组内,并对每一组内的记录进行排序。然后,取gap = gap / 2(这只是一种方法),重复上述分组和排序的工作。当到达gap = 1时,所有记录在统一组内排好序。

  1. gap > 1时都是预排序,,目的是让数组更加接近有序,这样排序算法的效率更高。当gap == 1的时候,数组已经接近有序了。
  2. 由于gap的取值方法不固定,希尔排序的时间复杂度很难计算

在Knuth所著的《计算机程序设计技巧》第三卷中,利用大量的实验统计资料得出,当n很大时,关键码平均比较次数和对象平均易懂次数大约在n1.25 到1.6n1.25的范围内,这是在利用直接插入排序作为子序列排序方法的情况下得到的。

所以我们暂时认为希尔排序的时间复杂度为O(n1.3)
3. 希尔排序没有办法保证排序的稳定性,是不稳定的。

希尔排序的代码:

void ShellSort(int* a, int n)
{int gap = n;//不能写成大于0,因为gap的值始终>=1while (gap > 1){//只有gap最后为1,才能保证最后有序//所以这里要加1gap = gap / 3 + 1;//gap = gap / 2;//这里只是把插入排序的1换成gap即可//但是这里不是排序完一个分组,再去//排序另一个分组,而是整体只过一遍//这样每次对于每组数据只排一部分//整个循环结束之后,所有组的数据排序完成for (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;}}
}

代码中标注了一些需要注意⚠️的点。

选择排序

基本思想

每一次从待排序的数据中找出最小(或最大)的一个元素放到序列起始(或末尾)的位置,直到全部待排序的数据排完。

直接选择排序

在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素。若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换。在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余1个元素。

直接选择排序代码:

void SelectSort(int* a, int n)
{assert(a);int begin = 0, end = n - 1;while (begin < end){int mini = begin, maxi = begin;for (int i = begin + 1; i <= end; i++){if (a[i] < a[mini]){mini = i;}if (a[i] > a[maxi]){maxi = i;}}Swap(&a[mini], &a[begin]);if (begin == maxi){maxi = mini;}Swap(&a[maxi], &a[end]);begin++;end--;}}

直接选择排序很好理解,每次找出待排序数据的最大值和最小值,但是时间复杂度为O(N2) 效率很低很低,实际基本不适用。另外,算法的空间复杂度为O(1),是不稳定的

堆排序

堆排序是选择排序的一种,其使用堆序来选数,效率就高了很多。堆排序的时间复杂度为O(N*logN),空间复杂度为O(1),是一种不稳定的排序

堆排序详细见我的另一篇博客:堆的应用:堆排序和TOP-K问题

交换排序

基本思想

交换的意思是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

冒泡排序

冒泡排序非常好理解,把数组中的每一个数字想象成一个“泡泡

数据结构——八大排序相关推荐

  1. 【数据结构排序算法系列】数据结构八大排序算法

    排序算法在计算机应用中随处可见,如Windows操作系统的文件管理中会自动对用户创建的文件按照一定的规则排序(这个规则用户可以自定义,默认按照文件名排序)因此熟练掌握各种排序算法是非常重要的,本博客将 ...

  2. 数据结构——八大排序(全)

    目录 排序的基本概念和分类 排序算法的稳定性 内排序和外排序 1. 时间性能 2.辅助空间 3.算法的复杂性 4.排序用到的结构体和函数 冒泡排序 排序原理 代码 代码1 代码2(正宗的冒泡排序) 代 ...

  3. [数据结构]八大排序算法总结

    作者: 华丞臧 专栏:[数据结构] 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞+收藏+关注).如果有错误的地方,欢迎在评论区指出. 推荐一款刷题网站

  4. 两万字搞定《数据结构》 八大排序 必读(建议收藏)

    前言:本章将介绍常见八大排序包括如下直接插入排序.希尔排序.选择排序.堆排序.冒泡排序.快排.归并排序以及计数排序(基数排序和桶排序面试基本不涉及,本文忽略了,有兴趣的读者可以自行补充),本章内容是重 ...

  5. Python数据结构常见的八大排序算法(详细整理)

    前言 八大排序,三大查找是<数据结构>当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法. 常见的八大排序算法,他们之间关系如下: 排序算法.png 他们的性能比较: 下 ...

  6. 我的软考之路(六)——数据结构与算法(4)之八大排序

    排序是编程的基础,在程序中会经常使用,好的排序方法可以帮助你提高程序运行的效率,所以学好排序,打好基础,对于程序的优化会手到擒来.无论你的技术多么强,如果没有基础也强不到哪去. 不多说了,我们直接进入 ...

  7. 数据结构算法---八大排序

    目录 冒泡排序 插入排序 希尔排序 选择排序 堆排序 计数排序 归并排序 快速排序 源码 一般使用的八大排序算法是:插入排序.选择排序.冒泡排序.希尔排序.归并排序.快速排序.堆排序.计数排序.   ...

  8. 数据结构进阶 八大排序算法详解

    数据结构就是定义出某种结构:像数组结构.链表结构.树形结构等,实现数据结构就是我们主动去管理增删查改的实现函数 排序的概念 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列 ...

  9. 【数据结构】八大排序

    文章目录 一.排序的基础知识 1.排序的概念 2.常见算法排序概览 3.排序的应用 二.八大排序介绍 1.直接插入排序 直接插入排序特性总结 2.希尔排序 希尔排序特性总结 3.选择排序 选择排序特性 ...

最新文章

  1. Python PIL库总结
  2. java 基础学习——基本语法(三)
  3. java连接本地oracle数据库_JAVA连接oracle数据库的三种方式
  4. CF1419E-Decryption【数论,dfs】
  5. Minio的MySQL通知 实现全过程
  6. 今天的练习是敏捷结果30天的最后一天
  7. 【分享】如何长时间高效学习
  8. 业务逻辑实现方式的讨论:存储过程 good or bad?
  9. Linux下Bash编程之算术运算符详解(三)
  10. 作为Scala语法糖的设计模式
  11. 在CNDS博客中插入Latex公式
  12. 【Java多线程】synchronized同步语句块
  13. CAD教程:CAD怎么绘制云线?
  14. vue 怎么销毁dom_Vue 中如何转移 Dom ?
  15. 建立“图书_读者”数据库及如下 3 个表,并输入实验数据,用 SQL 语句实现如下五个查询(opengauss)
  16. laravel常见错误(一):The page has expired due to inactivity. Please refresh and try again.
  17. python实验过程心得体会_web实训心得体会
  18. 人脸识别(一)调用face++实现人脸检测
  19. 大学期间所有课设及大作业源代码
  20. 【PyTorch】torch.mean(), dim=0, dim=1

热门文章

  1. WebRTC学习进阶之路 --- 五、WebRTC网络知识详解(三)(最全流媒体协议(RTP/RTCP/RTSP/RTMP/MMS/HLS/HTTP/ HTTP-FLV(HDL)/SDP)
  2. javaweb酒店会员管理系统 课程设计 毕业设计源码
  3. 戴尔官网BIOS转.bin文件教程
  4. [计算机组成原理]机器数及特点
  5. Firefox安装迅雷插件之后会出现重复提交问题
  6. Hive 结构[笔记2]
  7. 咸鱼Maya笔记—灯光阴影
  8. 血液透析滤过原理的系统性论述
  9. seo同义词替换在线工具_8个免费的网站管理员在线SEO工具
  10. deepcamp面试日记