对于近似有序序列(即除掉少数K个元素后是有序序列且K<<n),试分析直接插入排序,冒牌排序和简单选择排序的时间复杂度

学弟问的一道数据结构的题,关于一些排序算法的时间复杂度。

针对近似有序序列,

①当使用直接插入排序时,其基本操作为数组中元素的移动。最好情况下,待排序列有序,无需移动,此时时间复杂度为O(n),
当为近似有序序列是,其基本操作执行的次数是K次当前循环的最大值的和,即时间复杂度为O(k.n)由于k远小于n,
综合考虑直接插入排序的时间复杂度为O(n)

②当使用冒泡排序时,默认为普通冒泡排序,其基本操作为元素间比较的次数,因此无论
是否是近似有序,时间复杂度均为O(n^2)

③当使用简单排序时,其基本操作也为元素间的比较,与待排序列状态无关,即第i次的
比较次数为n-i,时间复杂度为O(n^2)

综上,若当前序列为近似有序序列时,直接插入排序效率最高。

原文地址:https://www.cnblogs.com/jiangxue2019/p/11965513.html

时间: 2024-11-10 08:54:19

对于近似有序序列(即除掉少数K个元素后是有序序列且K<<n),试分析直接插入排序,冒牌排序和简单选择排序的时间复杂度的相关文章

【2】【leetcode-105,106】 从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树 (没思路,典型记住思路好做) 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / 9 20 / 15 7 链接:https://www.nowcoder.com/questionTerminal/0ee054a8767c4a6c96ddab65e08688f4来源:牛客

排序算法之希尔排序及其增量序列

希尔排序 其他排序方法:选择排序.冒泡排序.归并排序.快速排序.插入排序.希尔排序 思想 希尔排序大概就是,选一组递减的整数作为增量序列.最小的增量必须为1:\(D_M>D_{M-1}>...>D_1=1\) 先用第一个增量把数组分为若干个子数组,每个子数组中的元素下标距离等于增量: 然后对每个子数组进行简单插入排序 再使用第二个增量,继续同样的操作,直到增量序列里的增量都使用过一次. (增量为1时,其实就是对整个数组进行简单插入排序) 图解 看图更容易理解吧: (借用一下慕课的浙大数据

lintcode 中等题:kth-largest-element 第k大元素

题目 第k大元素 在数组中找到第k大的元素 样例 给出数组[9,3,2,4,8],第三大的元素是4 给出数组 [1,2,3,4,5],第一大的元素是5,第二大的元素是4,第三大的元素是3,以此类推 注意 你可以交换数组中的元素的位置 挑战 要求时间复杂度为O(n),空间复杂度为O(1) 解题 理论快速排序的思想,每次都减半,这个时间复杂度也是O(N),至于为什么就不知道了 class Solution { /* * @param k : description of k * @param num

已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列

题目描述 输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列. 输入 第一行输入二叉树的先序遍历序列: 第二行输入二叉树的中序遍历序列. 输出 输出该二叉树的后序遍历序列. 示例输入 ABDCEF BDAECF 示例输出 DBEFCA #include <iostream> #include <cstring> #define MAX 50+3 using namespace std; typedef char Elem_Type; typedef struct B

判断一个数组是否是二叉搜索树的后序遍历序列 24

引言 ? ? 继续二叉树,这个题考的知识点是二叉树的后续遍历 ? ? 分析问题 ? ? 对于一个二叉树的后序遍历序列来说,最后一个数一定是根节点,然后前面的数中,从最开始到第一个大于根节点的数都是左子树中的数,而后面到倒数第二个数应该都是大于根节点的,是右子树,如果后面的数中有小于根节点的,那么说明这个序列不是二叉搜索树的后序遍历序列 ? ? 解决问题 ? ? 同样是用递归去做,首先要考虑Corner Case,如果array为空,那么返回false ? ? 然后找到根节点,根节点是array最

算法导论学习之线性时间求第k小元素+堆思想求前k大元素

对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思路例如以下: 1.分解:将A[p,r]分解成A[p,q-1]和A[q+1,r]两部分.使得A[p,q-1]都小于A[q],A[q+1,r]都不小于A[q]; 2.求解:假设A[q]恰好是第k小元素直接返回,假设第k小元素落在前半区间就到A[p,q-1]递归查找.否则到A[q+1,r]中递归查找. 3

如何找出单链表中的倒数第k个元素

(1)方法1:首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第k个,转换为正数第n-k个,接下去遍历一次就可以得到结果.但该算法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二次遍历用于查找正数第n-k个元素. (2)方法2:如果沿着从头到尾的方向,从链表中的某个元素开始,遍历k个元素后刚好达到链表尾,那么该元素就是要找的倒数第k个元素.根据这一性质,可以设计如下算法:从头节点开始,一次对链表的每一个节点元素进行这样的测试,遍历k个元素,查看是否到达链表尾,直到找到那个倒数第

第k大元素

题目描述:在数组中找到第k大的元素 样例:给出数组 [9,3,2,4,8],第三大的元素是 4:给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此类推 和上一道中位数的题(详见:点击打开链接)是一模一样的,需要注意的是,数组既然要按升序排列,那么第k大元素就是数组的倒数第k位,也就是索引为n - k的元素,还是按照快排的思想,通过一个分割函数找到每次枢轴应该排在的位置,比较这个位置和n - k的前后,如果恰好是n - k,直接返回:如果小于n -

现在有m组n个有序数组,例如{1,2,3,4},{2,3,4,6},{1,3,5,7},在这些数组中选择第k小的数据,然后返回这个值

问题描述:现在有m组n个有序数组,例如{1,2,3,4},{2,3,4,6},{1,3,5,7},在这些数组中选择第k小的数据,然后返回这个值 思路:参照两个数组归并的过程,每次选取最小的数据进行比较 1,定义选取位置数组index[m],初始化为0 2,每次根据index[m]寻找到第l_row个数组,确保当前时刻的第l_row数组的当前位置为最小值:寻找时确保index[i]的值小于n 3,把最小值取出,index[l_row]自增1 4,逐次寻找,知道找到第k个为止 1 public st