首页 > 编程语言 >选择、冒泡、插入排序——左神数据结构算法Day1学习笔记

选择、冒泡、插入排序——左神数据结构算法Day1学习笔记

时间:2024-03-13 20:01:44浏览次数:28  
标签:int 插入排序 左神 Day1 ++ num sizeof 复杂度 AxorB

时间复杂度:算法的常数操作数量级的数学表达式中,去除常数的最高阶项,比如aN²+bN+c的时间复杂度就是O(N²)。时间复杂度是数据量大到一定程度时,评价算法优劣的指标。当时间复杂度相同时,分析不同数据样本下的实际运行时间来比较算法的优劣。

额外空间复杂度:在执行代码过程中申请的额外存储空间。

选择排序:时间复杂度O(N²)

void selection_sort(int* a, int num)
{
    for (int i = 0; i < num - 1; ++i)
    {
        for (int j = i + 1; j < num; ++j)
        {
            if (a[i] > a[j])
            {
                a[i] = a[i] ^ a[j];
                a[j] = a[i] ^ a[j];
                a[i] = a[i] ^ a[j];
            }
        }
    }
}

冒泡排序:时间复杂度O(N²)

void bubble_sort(int* a, int num)
{
    for (int i = 0; i < num - 1; ++i)
    {
        for (int j = 0; j < num - i - 1; ++j)
        {
            if (a[j] > a[j + 1])
            {
                std::swap(a[j], a[j + 1]);
            }
        }
    }
}

冒泡排序中也可以用这种异或的交换数值方法:

//异或交换前提,&a[i] != &a[j]
a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j];
a[i] = a[i] ^ a[j];

两道关于异或的题目

  1. 许多数中只有一种出现了奇数词,其它数都出现了偶数次,找到这个数。
    #include<iostream>
    int main()
    {
        int eor = 0;
        int num[] = {1,2,2,2,2,3,3};
        for (int i = 0; i < sizeof(num) / sizeof(num[0]); ++i)
        {
            eor ^= num[i];
        }
        std::cout << "这个奇数是:" << eor << std::endl;
    }
  2. 许多数中只有两种数出现了奇数词,其他都出现了偶数次,找到这个数。
    #include<iostream>
    int main()
    {
        int AxorB = 0;//A、B异或的结果
        int A_or_B = 0;//A、B其中的一个
        int A_or_B_otherone = 0;//A、B中的另外一个
        
        int num[] = {1,2,2,2,2,3,3,3};
    
        for (int i = 0; i < sizeof(num) / sizeof(num[0]); ++i)
        {
            AxorB ^= num[i];
        }
    
        //rightOne是AxorB化为二进制数后,只保留最右侧的1,其它位为0
        int rightOne = AxorB & (~AxorB + 1);
        for (int i = 0; i < sizeof(num) / sizeof(num[0]); ++i)
        {
            if((rightOne & num[i]) == 0)
                A_or_B ^= num[i];
        }
        A_or_B_otherone = AxorB ^ A_or_B;
        std::cout << "这两个奇数是" << A_or_B_otherone << "和" << A_or_B << std::endl;
    }

插入排序:打扑克时往手牌里插牌。数据的状况会影响时间复杂度,按最差情况估计,插入排序的时间复杂度为O(N²)。

​void insertion_sort(int* a, int num)
{
    for (int i = 1; i < num; ++i)
    {
        int key = a[i];
        int j = i - 1;

        while (j >= 0 && a[j] > key)
        {
            a[j + 1] = a[j];
            j--;
        }

        a[j + 1] = key;
    }
}

二分法:时间复杂度O(logN)。数据状况特殊或问题特殊时可采用二分法,比如以下三个问题。

  1. 在一个有序数组中找一个数。
  2. 在一个有序数组中找大于等于某个值的最左侧位置。
  3. 局部最小值问题:无序数组中,相邻两个数不相等。 找到一个局部最小位置,要求时间复杂度好于O(N)。拉格朗日中值定理。

对数器:暴力尝试(不追求时间复杂度、好实现的方法)和自己的想测试的方法做比较。生成一个随机样本产生器,比对两个方法的结果是否相同,经过很多很多组测试,测试自己的方法的正确性。

标签:int,插入排序,左神,Day1,++,num,sizeof,复杂度,AxorB
From: https://blog.csdn.net/2301_79931971/article/details/136633760

相关文章

  • Linux软件高级编程-网络--TCP通信--day14
    TCP包头:1.序号:发送端发送数据包的编号2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用)TCP为什么安全可靠:1.在通信前建立三次握手连接  SYN    SYN+ACK    ACK 2.在通信过程中通过序列号和确认号保障数据传输的完整性  本次......
  • 运维必备Linux学习day1(建议收藏,运维面试100%会涉及)
    一.找回root密码找到以““Linux16”开头内容所在的行数”,在行的最后面输入:init=/bin/sh输完红色命令后Ctrl+X命令接下来在光标闪烁处,输入指令:mount-oremount,rw/(注意:各个单词间有空格)光标闪烁的位置中,输入passwd,输入一次密码并确认密码光标闪烁的位置中,touch/.auto......
  • 代码随想录算法训练营day17 | leetcode 110. 平衡二叉树、257. 二叉树的所有路径、404
    目录题目链接:110.平衡二叉树-简单题目链接:257.二叉树的所有路径-简单题目链接:404.左叶子之和-简单题目链接:110.平衡二叉树-简单题目描述:给定一个二叉树,判断它是否是平衡二叉树示例1:输入:root=[3,9,20,null,null,15,7]输出:true示例2:输入:root=[1,2,2,3,3,null,nul......
  • 每天一道蓝桥杯Day1 分考场(dfs+结论)
    题意:这道题第一眼咋看以为是图论,但是要抽象成图论的话就会变成:给定一个无向图,要求对点染色,使得任意相邻点之间颜色不能相同,试问最少的颜色数是多少?发现转化成图论后好像也没有什么图论算法可以解决,这个转化不是很有效。往往不知道怎么下手时可以试着考虑极端情况,比如考虑上界......
  • 每日一题 Day1
    每日一题Day1无重复字符的最长子串第一印象第一想法就是使用暴力解法,遍历出每个字符串再用条件筛选符合要求的字符串,时间复杂度为O(N^2)。滑动窗口与哈希表滑动窗口(双指针)多用于处理字符串与序列的操作,根据题目的要求,求解串中符合某种条件的序列的最长或者最短的长度。在本......
  • 代码随想录算法训练营day14 | leetcode 144. 二叉树的前序遍历、145. 二叉树的后序遍
    目录题目链接:144.二叉树的前序遍历-简单题目链接:145.二叉树的后序遍历-简单题目链接:94.二叉树的中序遍历-简单递归三要素:确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返回值是什么进而确定递归......
  • 小白从零开始学习编程 day1
    1.什么是编程语言编程语言是用于计算机与人沟通的介质2.什么是编程使用编程语言编写出一系列文件3.为什么进行编程通过奴役计算机,解放劳动力4.计算机的五大组成部分1.CPU(1)控制器:用于控制硬件(2)运算器:进行逻辑运算和算数运算2.内存(1)运行速度快(2)断电即......
  • 学习 Day1 MarkDown语法练习
    学习Day1MarkDown语法练习Day1,了解了MarkDown的基本语法,为日后的学习做准备。标题语法使用'#'号来标出标题的等级,如:一级标题为('#'+空格),二级标题为('##'+空格)例如:二级标题三级标题字体语法使用特定的语法给字体增加样式加粗字体(使用'**'号)倾斜字体(使用'*'号)......
  • Day1.numpy
    numpy数组的应用1.创建引入numpy库importnumpyasnp创建对象一维arr=np.array([1,2,3])二维arr=np.array([1,2,3],[4,5,6])#相当于一个二维数组2.常用属性T数组维度的转换dtype数据类型shape数组维度大小,如三行四列astype类型转换3.获取行列数arr......
  • 代码随想录算法训练营day13 | leetcode 239. 滑动窗口最大值、347. 前 K 个高频元素
    目录题目链接:239.滑动窗口最大值-困难题目链接:347.前K个高频元素-中等题目链接:239.滑动窗口最大值-困难题目描述:给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。......