先说结论

比较次数 与序列初态 无关 的算法是:二路归并排序、简单选择排序、基数排序
比较次数 与序列初态 有关 的算法是:快速排序、直接插入排序、冒泡排序、堆排序、希尔排序

排序趟数 与序列初态 无关 的算法是:直接插入排序、折半插入排序、希尔排序、简单选择排序、归并排序、基数排序
排序趟数 与序列初态 有关 的算法是:冒泡排序、快速排序


关于排序趟数

插入排序、选择排序 趟数都是固定的 n-1。对于插入排序来说,即使序列有序,也要依次从第二个元素开始,向前找它的插入位置。

冒泡排序 趟数与数据有关,优化冒泡排序的最优复杂度为O(n),其主要优化就是记录了前一趟是否冒泡,如果没有产生冒泡就说明数组已经有序,直接return。如果产生了冒泡,才继续执行。

快速排序 的排序趟数就是它的递归深度。当 快排 的数据是有序时候,会退化为冒泡,所以快排趟数也与初始序列顺序有关了。如下图:


关于比较次数

有同学在评论中提出了疑问,我在这里补充一下吧,关于对于比较次数和初始状态的关系的理解
堆排序:比如元素下沉的操作,虽然一个元素是从底部拉上来的,但这不代表这个元素一定会接着沉到底部,如果沉到中间就停止下沉的话,比较次数就少了。而这个过程的比较次数自然和下沉的深度是相关的。
希尔排序:希尔排序是对简单插入排序的改进,每一趟希尔的内部使用的就是简单插入排序。而简单插入排序随着数据变成正序时,执行效率最好,每次插入都不用移动前面的元素,时间复杂度为O(N)。当数据是反序时,执行效率最差,此时时间复杂度为O(N*N). 类比到希尔排序中,希尔排序本身就是属于插入排序。当然会随着有序而少比较几次。
(这里说的比较次数是精确的次数,区别于时间复杂度的概念,时间复杂度只是描述了数量级)

选择排序

i 从头开始,每次遍历之后所有的元素,k 从 i 开始,向后标记 选出 最小的元素,循环后如果大于 i ,则与 i 位置元素 交换,一直到最后。
简单选择排序它最大的特点是,交换移动数据次数相当少,这样也就节约了相应的时间,无论最好最坏的情况,其比较次数都是一样多。第 i 次排序需要进行n-i 次关键字的比较,此时需要比较n-1+n-2+…+1=n(n-1)/2次,所以 总比较次数 与初始状态 无关,时间复杂度为O(n^2)。

对于交换次数而言,最差的时候,也就初始排序,交换次数为n-1次,复杂度为O(n)。当全部已经排序好时,则不发生交换,所以 元素总移动次数 与初始状态 有关

直接插入排序

从当前关键字之前的关键字开始扫描,如果大于待排关键字,则后移一位。直到全部记录插入完成。

如果全部有序,则只需要遍历一趟就完成了排序,比较次数为 n-1,并且在这个过程中没有发生元素的移动。因此,比较次数 与序列初态 有关 。初始序列基本有序时,移动元素最少(效率最高)。

void insertSort(int A[],int n)
{int i, j, temp;for (i = 1; i < n; i++) { // 将各元素插入已经排好的序列中if (A[i] < A[i - 1]) { // 若A[i]关键字小于前驱temp = A[i]; // 用 temp 暂存 A[i]for (j = i - 1; j >= 0 && A[j] > temp; --j) // 检查所有前面已经排好序的元素A[j + 1] = A[j]; // 将所有大于 temp 的元素右移一个位置A[j + 1] = temp; // 复制到插入位置}}
}

若使用 折半插入 来进行优化,虽然减少了元素的比较次数,但并未使时间复杂度脱离O(n^2)


关于算法复杂度与序列初态的关系

算法复杂度 与初始状态 无关 的有哪些?

首先看内排序总结表:


由表中红线标出的地方可以轻易得出,以下四种排序方法的算法复杂度与数组的初始状态无关

一堆(堆排序)乌龟(归并排序)选(选择排序)基(基数排序)友。

数据结构:排序趟数 / 比较次数与序列的原始状态有关的排序方法有哪些?相关推荐

  1. 关于那些排序算法的排序趟数与原始状态无关的

    交换类的排序:其趟数与原始序列状态有关,比如冒泡排序,在冒泡排序中,可以设置一个判断,若某一趟排序没发生交换则可以终止排序:故冒泡排序与初始状态有关. 直接插入排序:每一趟排序都插入一个元素,所以排序 ...

  2. 数据结构与算法--数字在排序数组中出现次数

    数字在排序数组中出现次数 题目:统计一个数字在一个排序数组中出现的次数.例如,输入数组{1,2,3,3,3,3,3,4,5} 和数字3,由于3 在数组中出现的次数是5,因此返回5 简单方案一 既然输入 ...

  3. 买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)

    上篇的动图数据结构反响不错,这次来个动图排序算法大全.数据结构与算法,齐了. 几张动态图捋清Java常用数据结构及其设计原理 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: ...

  4. 数据结构源码笔记(C语言):英文单词按字典序排序的基数排序

    //实现英文单词按字典序排序的基数排序算法#include<stdio.h> #include<malloc.h> #include<string.h>#defin ...

  5. c语言排序需要插空的最小次数,C语言数组排序——冒泡排序、选择排序、插入排序...

    一.冒泡排序 原理解析:(以从小到大排序为例)在一排数字中,将第一个与第二个比较大小,如果后面的数比前面的小,则交换他们的位置. 然后比较第二.第三个--直到比较第n-1个和第n个,此时,每一次比较都 ...

  6. 流畅的python学习笔记(三):数据结构(3:文本和字节序列)

    文本和字节序列 大纲 1. 字符问题 2. 字节概要 2.1 结构体和内存视图 3. 基本的编解码器 4. 了解编解码问题 4.1 处理UnicodeEncodeError 4.2 处理Unicode ...

  7. 排序趟[置顶] Java和C实现的冒泡排序(基本思想)

    本篇文章朋友在北京喝咖啡的时候突然想到的...最近就有想写几篇关于排序趟的笔记,所以回家到之后就奋笔疾书的写出来发表了 交换排序的基本思想是:两两比拟待排序记录的关键字,发现两个记录的次序相反时即停止 ...

  8. 外排序时间估计和趟数计算的理解

    学习一个算法题过程中涉及到外排序,就把外排序的知识复习一遍.复习中对趟数计算,我似乎觉得应该很好理解,但又好像不能透彻的理解,就问自己能不能给出一个清晰的证明.尝试了进一步的理解. I估计外排序的时间 ...

  9. 计算找到出现最多的数字和次数 ,实现数组去重 ,进行排序。

    实现 1.计算找到出现最多的数字和次数 2. 实现数组去重 3. 进行排序 <!DOCTYPE html> <html lang="en"><head ...

最新文章

  1. 大数据开发套件—调度运维常见问题
  2. hive sqoop 分区导入_使用sqoop将hive分区表的数据导入到mysql的解决方案:shell脚本循环...
  3. 数据中台(三)数据中台设计与数据资产管理
  4. Java 并发——多线程基础
  5. 【数据结构与算法】之深入解析“合并区间”的求解思路与算法示例
  6. 趁着对象泡脚的功夫,我把vueX吃透了
  7. python列表相关函数_python中列表(list)相关的函数
  8. 看面试题感觉生疏的知识点
  9. 迅雷发布了自主研发的TCFS协议,有意转型区块链开发的必看
  10. IDEA操作 名字快速驼峰等操作
  11. symbol lookup error: /home/quantum6/build_libs/lib/libreadline.so.7: undefined symbol: UP
  12. C语言 qq自动点赞程序,qq自动无限点赞脚本
  13. Android关系型数据库应用——电话(短信)黑名单 .
  14. 基于vue和springboot的物流仓储管理系统
  15. 爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
  16. win10升级助手_微软官网win10下载_win10教程
  17. 雕虫小技 - 签名图片生成器
  18. 牛客小白月赛2 J 美 【构造】
  19. android 平板 吃鸡,吃鸡不卡的安卓平板
  20. Python廖雪峰教程学习笔记:Day4

热门文章

  1. HDU - 3338 Kakuro Extension(最大流+思维建边)
  2. python各种数据类型的常用方法_python的基本数据类型:列表的方法
  3. windows server 2016安装oracle 10_Weblogic12.1.3.0补丁安装(win server与linux安装步骤介绍)
  4. UVa439 Knight Move 骑士的移动(bfs)
  5. 排序算法-05简单选择排序(python实现)
  6. mysql 定时同步数据_MySQL数据同步之otter
  7. python对excel表格操作
  8. 浅析ProcessBuilder
  9. 未来已来,音视频江湖再起波澜
  10. 中南大学张昊:我非常期待基于AI的图像视频编码技术的创新