记录-常见算法的收集

2023-11-10

1,快速排序--找到基准点的位置

既不浪费空间又可以快一点的排序算法。

如:“6 1 2 7 9 3 4 5 10 8”这10个数进行排序。首先找到一个数作为基准点(一个参照数),为了方便,让第一个数6作为基准点。然后将这个序列中所有比基准数大的数放在6右边,比基准点小的数放在6的左边,类似这种:“3 1 2 5 4 6 9 7 10 8”.

相当于每一次快速排序,就将基准点的位置确定了,然后,比基准点小的数在位置左边,比基准点大的数在位置右边,然后再选取新的基准点,再进行快速排序。)

解释:分别在初始序列“6 1 2 7 9 3 4 5 10 8”两端开始“探测”。从右到左找小于6的数,从左到右找大于6的数,然后交换他们。

这里用i和j,分别指向序列最左边和最右边。即i=1,指向数字6,j=10,指向数字。

首先j开始行动。因为此处设置的基准数是最左边的数,所以需要j先动。

j向左移动(j--),直到找到一个小于6的数停下。

然后i向右移动(i++),直到找到一个大于6的数停下。

例子里,j是在数字5的位置,i是在数字7的位置上。


交换i和j位置上的数字,这样:“6 1 2 5 9 3 4 7 10 8”。

到此,第一次交换结束。

然后,继续让j向左移动,找比6小的数,即“4”。

让i向右移动,找到比6大的数,即“9”。

进行交换,这样:“6 1 2 5 4 3 9 7 10 8”。第二次交换结束。

继续这样移动,找值,j发现了3,停下。i向右移动,遇到了j。说明“探测”结束。

将基准数6和3交换,这个位置定为基准数的位置。“3 1 2 5 4 6 9 7 10 8”.


第一次的“探测”结束(可以理解为一次快速排序结束,基准点找到了位置)。

过程:j找到小于基准数的数,i找到大于基准数的数,直到i和j相遇。

接下来,要以基准点6,分为两个序列,左边“3 1 2 5 4”,右边“9 7 10 8”。

按照以上的方法,处理两个序列。

左边:“3 1 2 5 4”。以3为基准点,3的左边都小于等于3,3的右边都大于等于3.

            结果“2 1 3 5 4”。i和j相遇,值交换,3以归位。

             然后继续分为两个序列,“2 1”和“5 4”,在排序。

             这样左边结束后,结果“1 2 3 4 5 6 9 7 10 8”。

右边:“9 7 10 8”。同理,得到“1 2 3 4 5 6 7 8 9 10”。


分析:快速排序比较快,以外每次交换都是跳跃式的。每次交换不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离大了,交换的次数也就少了。

           当然在最坏的情况下,还是可能相邻的两个数进行交换,所以快速排序的zui最差时间复杂度和冒泡排序是一样的O(N2)平均时间复杂度O(NlogN)

代码(c++):

#include <stdio.h>
int a[101],n;  //全局变量
void quicksort(int left,int right)  //位置,索引
{
    int i,j,t,temp;
    if(left>right) return;
    temp=a[left];  //temp中存的是基准数
    i=left;
    j=right;
    while(i!=j)
    {
        while(a[j]>=temp && i<j)  //顺序很重要,从右边先开始,找小于基准点的数
            j--;
        while(a[i]<=temp && i<j)  //找大于基准点的数
            i++;
        if(i<j)  //交换位置
        {
            t=a[i];
            a[i]=a[j];
            a[j]=t;    
        }
    }
    //基准数归位
    a[left]=a[i];
    a[i]=temp;
    quicksort(left,i-1); //处理左边的,递归
    quicksort(i+1,right); //处理右边的,递归
}

抄录于:详细快速排序

代码(java):

public void quick_sort(int []a,int left,int right){
    if(left>right)  return;
    int i=left;
    int j=right;
    int temp=a[left];
    while(i!=j){
        while(i<j && a[j]>=temp)
            j--;
        while(i<j && a[i]<=temp)
            i++;
        if(i<j){
            int tt=a[i];
            a[i]=a[j];
            a[j]=tt;
        }
    }
    int kk=a[i];
    a[i]=temp;
    a[left]=kk;
    quick_sort(a,left,i-1);
    quick_sort(a,j+1,right);
}

2,冒泡排序--相邻比较,找到最值

基本思想:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到无序队列的队尾,从而成为有序序列的一部分;然后继续这个过程。

通过两两比较交换位置,选出剩余无序序列中最大(小)的数据元素放到队尾。

时间复杂度:O(N2)也有说最优时间复杂度是O(n),这里不提。空间复杂度:O(1)。

过程:1,比较相邻的元素。如果第一个比第二个大(小),交换。

           2,对每一对相邻元素做同样的工作,从开始到结尾,最后的元素是最大(小)的数。

           3,针对所有的元素重复以上步骤,除了有序的元素。(已选出的元素)

            4,持续对无序元素重复以上步骤,直到都有序。

例如:


以上为例(小到大):

        第一次排序,3,6比较,不需要交换。6,4比较,交换得到4,6。

                             6,2比较,交换得2,6。  6,11比较,不交换。

                             11,10比较,交换得10,11。11,5比较,交换得5,11。

                              得到“3 4 2 6 10 5 11”。

        之后的排序最后有序的序列不参与,元素两者之间的比较。得到最大值,放在无序序列的队尾。

代码(c++):

void bubble_sort(int arr[],int len){
    int i,j;
    for(i=0;i<len-1;i++){
        for(j=0;j<len-1-i;j++){ //无序序列长度
            if(arr[j]>arr[j+1])
                swap(arr[j],arr[j+1]);
        }
    }
}

代码(java):

public static void bubble_sort(int[] arr){
    int i,j,temp,len=arr.length;
    for(i=0;i<len-1;i++){
        for(j=0;j<len-1-i;j++){
            if(arr[j]>arr[j+1]){
                temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
}

3,二分查找算法--数组中以中间值二分查找数

二分查找算法是在有序数组中用到较为频繁的一种查找算法。对数组一直进行二分,然后查找到数

对数组进行遍历,每个元素进行比较,其时间是O(n)。二分查找则是O(lgn)。

重点:二分查找的时间复杂度O(logn)。最坏的情况下是O(n)

           二分查找的条件是待查询的数组是有序的,我们假设数组是升序。

            二分查找主要思路:设定两个指针start和end分别指向数组的首尾两端,然后比较数组中间节点array[mid]和待查找元素。如果待查找元素小于中间元素,那么表明待查找元素在数组的前半段,那么将end=mid-1;如果待查找元素大于中间元素,那么表明待查找元素在数组的后半段,那么将start=mid+1;如果待查找元素等于中间元素,那么就是mid的值。

例如,{1,2,3,4,5,6,7,8,9}查找6:

        1,中间元素mid=(start+end)/2,即5。5<6,所有,6在{6,7,8,9}中。

        2,{6,7,8,9}中间元素,即8。8>6,元素在{6,7,8}中查找。

        3,{6,7,8}中间元素,即7。7>6,左边数组只剩下6,找到了。

代码(java):

public class BinarySearch {  
public static void main(String[] args) {  
int [] array = {1,2,3,4,4,7,12};  
int len = array.length;   
}  
/**  
 * 二分查找(递归)  
 * @param arry 递增数组  
 * @param value 待查找数值  
 * @param start 起始查找位置  
 * @param end 末查找位置  
 * @return  
 */  
private static int binarySearchRecursion(int arry[],int value,int start,int end)  
{  
    if(start > end)  
        return -1;  
    int mid=start + (end-start)/2;  
    if(arry[mid] == value)  
        return mid;  
    else if(value < arry[mid])  
    {  
        end = mid - 1;  
        return binarySearchRecursion(arry,value,start,end);  
    }  
    else  
    {  
        start = mid + 1;  
        return binarySearchRecursion(arry,value,start,end);  
    }  
}  
/**  
 * 二分查找(非递归,循环)  
 * @param arry 递增数组  
 * @param value 待查找数值  
 * @param start 起始查找位置  
 * @param end 末查找位置  
 * @return  
 */  
private static int binarySearchRecursionNon(int arry[],int value,int start,int end)  
{  
while(start <= end){  
    int mid=start + (end-start)/2;  //或者是 (start+end)/2
    if(arry[mid] == value)  
        return mid;  
    else if(value < arry[mid])  
    {  
        end = mid - 1;  
    }  
    else  
        start = mid + 1;  
}  
return -1;  
}  
}  

时间复杂度:外循环和内循环以及判断和交换元素的时间开销。最优情况是开始就排好序了,不用交换元素,最坏的是逆序。

空间复杂度:在交换元素时那个临时变量所占的内存空间。最优情况是开始就排好序了,不用交换元素,最坏的是逆序。

这些是自己的一些记录收集和理解。










本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记录-常见算法的收集 的相关文章

  • React使用公共文件夹public

    两者区别 其实放在两个文件夹区别就在于是否会被webpack所处理 如果您将文件放入该public文件夹 webpack 将不会处理它 在你打包的时候 会将public文件夹直接复制一份到你构建出来的文件夹中 而src assets目录的文
  • 元素和小于等于阈值的正方形的最大边长

    LeetCode 1292 元素和小于等于阈值的正方形的最大边长 给你一个大小为 m x n 的矩阵 mat 和一个整数阈值 threshold 请你返回元素总和小于或等于阈值的正方形区域的最大边长 如果没有这样的正方形区域 则返回 0 示
  • C语言之冒泡排序、快速排序法、希尔排序法

    众所周知编程排序方法众多而且程序的好坏就取决于算法的使用 下面是博主现在会的几种排序方法希望对大家有所帮助 希尔排序法 Author Stylle Date 2020 11 14 15 52 03 LastEditors Stylle La
  • 顺序表的冒泡排序算法及二分法查找代码实现

    本文主要实现了比较经典的冒泡排序算法 对已经有序或者基本有序的顺序表复杂度大大降低 和二分法查找 各位看官看代码吧 冒泡排序算法及二分法查找 include stdio h typedef struct int key SSTable El
  • C++实现——排序算法总结

    常见的排序算法有 直接插入 希尔 冒泡 快速 选择 堆排序 归并 基数 下面一一分析 并实现 1 冒泡排序 冒泡排序是最简单的排序算法 冒泡排序的基本思想是从后往前 或从前往后 两两比较相邻元素的值 若为逆序 则交换它们 直到序列比较完毕
  • 统计数字出现的次数

    在论坛上看到这么一个题 JAVA题 要求任意输入20个10以内的整数 并判断输出每个数字的出现次数并输出 这个题也可以转化为 长度为n n lt 1000 的整数 输出每个数字出现的次数 上面两个题意思相同 每个数字范围只有 0 9 所以我
  • JavaScript 实现 -- 快速排序

    文章目录 快速排序 快排原理 代码实现 快排过程 时间复杂度 算法稳定性 快速排序 快速排序算法是在分治算法基础上设计出来的一种排序算法 和其它排序算法相比 快速排序算法具有效率高 耗费资源少 容易实现等优点 快排原理 选择一个基准数 通过
  • visio 2010激活教程

    一 下载office2010toolkit zip 若下载链接失效 手动搜索office2010toolkit http ys c ys168 com 605279628 o4W138W45JIPI5SiuWf5 office2010too
  • 冒泡排序和鸡尾酒排序

    传统冒泡排序 import java util Arrays author 新新 ClassName BubbleSort Description 冒泡排序 date 2022年03月17日 public class BubbleSort1
  • LeetCode 1493. 删掉一个元素以后全为 1 的最长子数组 - 二分 + 滑动窗口

    删掉一个元素以后全为 1 的最长子数组 提示 中等 90 相关企业 给你一个二进制数组 nums 你需要从中删掉一个元素 请你在删掉元素的结果数组中 返回最长的且只包含 1 的非空子数组的长度 如果不存在这样的子数组 请返回 0 提示 1
  • 快速排序(qsort)

    快速排序 排序方法有很多种 选择排序 冒泡排序 归并排序 快速排序等 看名字都知道快速排序是目前公认的一种比较好的排序算法 快速排序的核心思想是二分法 在此 我以升序为例 首先 我们需要选取一个基准数temp 再通过循环比较 将比基准数小的
  • 各类排序算法的比较总结

    排序算法是最基本最常用的算法 不同的排序算法在不同的场景或应用中会有不同的表现 我们需要对各种排序算法熟练才能将它们应用到实际当中 才能更好地发挥它们的优势 今天 来总结下各种排序算法 下面这个表格总结了各种排序算法的复杂度与稳定性 各种排
  • springboot报错Could not autowire. No beans of ‘RedisConnectionFactory‘ type found

    这个报错提示是因为springboot升级到2 6 9以后版本就会出现 报错界面 其实上面报错不影响程序使用 但是总是觉得别扭 提供3种解决方式 第一种方案 springboot版本降到2 6 9或以下 第二种方案 通过idea设置不提示该
  • 12306验证码具体坐标

    如图 整张图片的大小是 293 190 单位 像素 包括下述 锦旗二字相对大图的范围是 117 0 258 29 长 141 宽 29 第一排第一张小图片的范围是 5 41 72 108 长 67 宽 67 间距都是5px 第二排第一张小图
  • win32汇编语言实现冒泡排序

    1 背景 现在大多数的大规模程序并不是由汇编语言来编写 原因很简单 因为太耗时了 但是汇编语言仍然被广泛运用在配置硬件设备以及优化程序的执行速度和尺寸大小等方面 特别是在逆向工程方面 更需要深入理解与熟练掌握汇编语言 针对现阶段 看汇编基本
  • 我的算法笔记(1)——冒泡排序

    我的算法笔记 1 冒泡排序 排序是指将一个无序序列按某个规则进行有序排列 而冒泡排序是排序算法中最基础的一种 现给出一个序列a 其中元素的个数为n 要求将他们按从小到大的顺序排序 冒泡排序的本质在于交换 即每次通过交换的方式把当前剩余元素的
  • Ubuntu 周立功CAN分析仪 USBCAN-II 驱动

    首先从官网https www zlg cn Index Search search key linux的下载资料界面下载 Linux驱动 USBCAN I I II II 2A I MINI安装驱动 USBCAN II新版驱动基于libus
  • 四种排序:选择,插入,冒泡,快速排序原理及其对应的时间、空间复杂度解析

    四种排序 选择 插入 冒泡 快速排序原理及其对应的时间空间复杂度 首先 在了解四种排序之前 让我们来了解一下什么是时间复杂度和空间复杂度 时间复杂度 算法的时间复杂度是一个函数 它定性描述该算法的运行时间 记做T n 直白的来说 就是指运行
  • 算法通关村——二分查找在寻找数组峰顶中的应用

    题目 在数组i的某个位置i 开始 从 0 到 i 都是递增的 从 i 1 都是递减的 请你找到这个最高点 方法一 使用线性遍历实现 分析 最高点如果存在 需要满足arr i 1 lt arr i gt arr i 1 又因为题目说了0到i就
  • 【LeetCode:162. 寻找峰值 | 二分】

    算法题 算法刷题专栏 面试必备算法 面试高频算法 越难的东西 越要努力坚持 因为它具有很高的价值 算法就是这样 作者简介 硕风和炜 CSDN Java领域新星创作者 保研 国家奖学金 高中学习JAVA 大学完善JAVA开发技术栈 面试刷题

随机推荐

  • std::enable_shared_from_this消除异步回调引发的野指针问题

    std enable shared from this这个C 组件完美解决了异步回调发生时宿主对象销毁的问题 C 提供了lambda表达式和各种异步函数 std thread std async或者其他框架api都提供了异步回调方法 特别是
  • js实现数组去重、比较两数组得出重复部分

    数组去重的两种方法 1 用新对象来存储 对象的key值为数组元素 var removeDup function old var arr 1 2 3 4 3 4 5 var o for var i 0 i lt arr length i va
  • Android MVC MVP MVVM

    浅谈 MVP in Android MVP模式解析实践 Android DataBinding库 MVVM设计模式
  • 浏览器兼容性测试工具

    相关连接 浏览器兼容性概述 目录 一 浏览器兼容性测试工具 1 0 IETester 免费 exe 1 1 SuperPreview 收费 exe 1 2 Adobe Browserlab 在线测试 1 3 BrowserStack 在线测
  • 从HTTP 2.0想到的关于传输层协议的一些事

    0 HTTP协议的历史我也不知道 1 关于HTTP 2 0收到了订阅的邮件 头版是说HTTP 2 0的内容 我本人不是很关注HTTP这一块儿 但是闲得无聊时也会瞟两眼的 HTTP 2 0的最大改进我觉得有两点 第一 新增了帧层 帧层的好处在
  • ThinkPHP3.2微信JSSDK签名配置config信息

    ThinkPHP3 2 controller代码 微信jssdk踩坑记 必须在服务器部署才有用 1 配置js接口安全域名不要加http 等 大坑 2 用appid和appsecret发起请求换取access token并将其全局缓存 3 用
  • 发布自己写的python包(得瑟)

    如何把自己写的包发布到pipy给别人用呢 网上一堆教程 众所周知网上教程都比较长 得耐心看完 学会了消化之后变成自己的了记录一下 第一步包的目录结构 抄作业就完了 第二步设置setup py 有个for human的模板 老哥起名也是幽默
  • adb shell dumpsys 使用命令和来源

    一 概述 adb shell dumpsys 在Android开发中经常要用到 平时都是零碎的积累 用到什么的时候就 记录下来 最近看了一些资料 发现可以汇总所有的命令 当带某个参数的时候 就可以查看具体 的信息 本篇文章中还讲解了如何去找
  • 【二维费用的完全背包问题】

    前言 简单写一下算法设计与分析这门课的一次实验 原题要求是用0 1背包来做 但是老师要求用完全背包来做 一 完全背包与0 1背包有什么区别 0 1背包 顾名思义对于每件物品只能拿1次或者0次 而完全背包对于每件物品的拿取没有次数限制 二 二
  • beyond compare破解方法

    BeyondCompare4相关操作 1 修改文件C Program Files Beyond Compare 4 BCUnrar dll 这个文件重命名或者直接删除 2 将以下操作保存为bat文件 然后双击运行即可 reg delete
  • java多态-对象多态

    对象多态 动态绑定 动态连接 package com leoworld polymorphism 多态的成员访问特点 A 成员变量 编译看左边 运行看左边 B 成员方法 编译看左边 运行看右边 为什么呢 因为成员方法有重写 而变量没有 C
  • 计算机dvd驱动错误,修正:一个错误发生在弹出的CD/DVD驱动器在Windows 10

    如果您使用的是可移动媒体 比如DVD或USB驱动器 有时您可能会在从系统中删除或弹出它时遇到麻烦 通常 Windows会拒绝当前正在使用的驱动器的请求 这意味着你应该首先关闭程序 应用程序 进程使用驱动器上的内容 然后你应该继续试着弹出驱动
  • 【Software Engineering】【期末复习知识点】【2023春】【仅供参考】

    文章目录 类型 总分占比 出勤 10 平时作业 2 5 10 期中考试 10 期末考试 70 附加分 提问加分 题型 题量 分值 预测 选择 15 2 填空 5 2 软件工程方法学 名词解释 5 2 软件危机 软件生命周期 简答 3 5 综
  • html中表单form的语法结构以及释义

    1 form属性
  • Redis command timed out nested exception is io.lettuce.core.RedisCommandTimeoutException

    报错如下 ERROR org springframework dao QueryTimeoutException Redis command timed out nested exception is io lettuce core Red
  • CSS3 2D转换之位移(translate)、旋转(rotate)、缩放(scale)以及设置旋转和缩放的中心点

    2D转换概述 2D转换可以实现元素的位移 旋转 缩放等效果 2D转换的分类有 移动 translate 旋转 rotate 缩放 scale 2D转换之translate 2D移动translate可以改变元素在页面中的位置 类似定位 移动
  • Eigen:C++中Eigen库的安装与学习

    1 下载地址 http eigen tuxfamily org index php title Main Page 进入上边官方网站进行下载如下所示 找到自己需要的版本下载即可 我下载的是3 3 8 右边的zip 2 解压配置即可 找到你下
  • Kafka配置与使用

    Kafka依赖于zookeeper 因此先配置zookeeeper zookeeper配置 修改 opt bigdata zookeeper conf zoo cfg dataDir data zookeeper 配置zookeeper数据
  • Java实现通过证书访问Https请求

    创建证书管理器类 import java io FileInputStream import java security KeyStore import java security cert CertificateException imp
  • 记录-常见算法的收集

    1 快速排序 找到基准点的位置 既不浪费空间又可以快一点的排序算法 如 6 1 2 7 9 3 4 5 10 8 这10个数进行排序 首先找到一个数作为基准点 一个参照数 为了方便 让第一个数6作为基准点 然后将这个序列中所有比基准数大的数