记录-常见算法的收集

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(使用前将#替换为@)

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

  • vue 数组按时间排序

  • java实现冒泡排序+图解冒泡排序+代码实现+代码解析(java)

    基本介绍 冒泡排序 Bubble Sorting 的基本思想是 通过对待 排序序列从前向后 从下标较小的元素开始 依次比较 相邻元素的值 若发现逆序则交换 使值较大 的元素逐渐从前移向后部 就象水底下的气泡一样逐渐 向上冒 由于上面的栗子举
  • kafka日志分段(.log文件)及日志文件索引机制(偏移量索引、时间戳索引)

    Kafka版本 2 2 1 环境 CDH 日志分段 segment 格式 在kafka数据存储的目录下 进入topic文件目录 可以看到多个文件 如下 从文件名可以看出 log index timeindex文件一一对应 rw r r 1
  • [C语言]浮点型在内存中的存储

    在上一篇文章 我们讲述了整型在内存中的存储 这篇文章我们就一起来看一下 浮点型在内存中的存储 回顾 整型在内存中的存储 C语言 和我一起来认识 整型在内存中的存储 HY PIGIE的博客 CSDN博客 目录 1 浮点数家族 2 整型和浮点型
  • C++实现——排序算法总结

    常见的排序算法有 直接插入 希尔 冒泡 快速 选择 堆排序 归并 基数 下面一一分析 并实现 1 冒泡排序 冒泡排序是最简单的排序算法 冒泡排序的基本思想是从后往前 或从前往后 两两比较相邻元素的值 若为逆序 则交换它们 直到序列比较完毕
  • 三种常用的排序方法图解及C语言实现(选择排序,冒泡排序,快速排序)

    选择排序 冒泡排序 快速排序 选择排序 选择排序是最简单直观的一种算法 选择排序是不稳定排序 基本思想 首先在未排序序列中找到最小 大 元素 存放到排序序列的起始位置 然后 再从剩余未排序元素中继续寻找最小 大 元素 然后放到已排序序列的末
  • 3月打卡活动第20天 面试题第40题:最小的k个数(简单)

    3月打卡活动第20天 面试题第40题 最小的k个数 简单 题目 输入整数数组 arr 找出其中最小的 k 个数 例如 输入4 5 1 6 2 7 3 8这8个数字 则最小的4个数字是1 2 3 4 解题思路 排序 取前k个值 class S
  • 统计数字出现的次数

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

    链表的归并排序和快速排序 归并排序 Definition for ListNode public class ListNode int val ListNode next ListNode int x val x next null pub
  • java递归和非递归实现快排

    Java递归和非递归实现快排 文章目录 Java递归和非递归实现快排 前言 一 快速排序基本逻辑 二 过程演示 三 实现代码 总结 前言 最近复习数据结构 顺便复习快速排序的过程 一 快速排序基本逻辑 快排以某个关键字为基准 将待排序序列分
  • JavaScript 实现 -- 快速排序

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

  • Jetson TX2 外接开机键

    J20端子最下面两个插针对应PWR和GND 短接即可开机 左侧丝印已经标注出J20插针的定义
  • 冒泡排序和鸡尾酒排序

    传统冒泡排序 import java util Arrays author 新新 ClassName BubbleSort Description 冒泡排序 date 2022年03月17日 public class BubbleSort1
  • C语言 缓存区溢出 3221225725

    目录 问题描述 解决办法 问题描述 DEV C报错 Process exited after 4 03 seconds with return value 3221225725 原因 数组定义的容量太大 五十万起步的样子 而且每次循环都会再
  • 12306验证码具体坐标

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

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

    文章目录 1 查找的基本概念 2 线性表的查找 2 1 顺序查找 线性查找 算法2 1 0 类型定义 算法2 1 1 顺序查找 算法2 1 2 改进后的顺序查找 性能分析 2 2 折半查找 二分或对分查找 算法2 2 1 非递归算法 算法2
  • 记录WSL2配置

    Windows10上安装了WSL2 并通过手动安装了Ubuntu18 04版本 运用Cmder作为终端 quake风格 外观和使用方面都很舒适 shell使用了ohmyzsh 较于默认的shell 功能更加强大且观感更好 编写代码时 利用V
  • 【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作为基准点 然后将这个序列中所有比基准数大的数