Cpp LeetCode

模拟 排列的特性 - 下一个排列 排序 bubble sort //逐个冒出当前最大值 template <class T> void bubble_sort(T arr[],int len){ for(int i=0;i<len-1;i++){ for(int j=0;j<len-i-1;j++) if(arr[j]>arr[j+1]) swap(arr[j],arr[j+1]); } } //设置flag,如果存在一轮冒泡没有进行交换,则排序完成 selection sort //从序列中选出该位置上应该出现的元素 template <class T> void selection_sort(T arr[],int len){ for(int i=0;i<len-1;i++){ int index=i; for(int j=i+1;j<len;j++){ if(arr[j]<arr[index]){ index=j; } } swap(arr[i],arr[index]); } direct_insert_sort //向前遍历有序序列,寻找当前元素的合适位置插入 template <class T> void direct_insertion_sort(T arr[],int len){ for(int i=1;i<len;i++){ T key=arr[i]; int j=i; while(j-1>=0&&arr[j-1]>key){ arr[j]=arr[j-1]; j--; } arr[j]=key; }//位置j的元素要么是j-1(挪),要么是key(插) } //二分法加快插入位置的搜索 shell _sort //宏观性优先调控,减少插排比较和交换次数 template <class T> void shell_sort(T arr[],int len){ int h=1; while(h<len/3) h=3*h+1; while(h>=1){ for(int i=h;i<len;i++){ T key=arr[i]; int j=i; while(j-h>=0&&key<arr[j-h]){ arr[j]=arr[j-h]; j-=h; } arr[j]=key; } h/=3; } } //对于增量以除以2递减的排序,时间代价:$\theta$(n^2^);选取的增量之间并不互质,上一轮排序中某些子序列已经排过了导致处理效率不高 //对于增量不以除以2递减的排序,时间代价:$\theta$(n^3/2^) qsort /*1.选择轴值 2.划分两个子序列L和R - 使得L中所有记录都小于或者等于轴值 - R中记录大于轴值 */ //采用双指针排列小序列,也可以使用夹逼的方式 int partitioner(int arr[],int low,int high){ int pivot=arr[high]; int i=low; for(int j=low;j<high;j++)//处理low~high-1的元素pivot分离 if(arr[j]<pivot) swap(arr[i++],arr[j]); swap(arr[i],arr[high]); //对小于pivot的最后一个元素的后一位置与pivot交换(包括边界) return i; } void qsort(int arr[],int low,int high){ if(low<high){ int mid=partitioner(arr,low,high); qsort(arr,low,mid-1); qsort(arr,mid+1,high); } } inline int findpivot(int* arr,int i ,int j){ return (i+j)/2; } inline int Partition(int* arr,int left,int right,int pivotindex){ swap(arr[pivotindex],arr[right]); int pivot = arr[right]; int i = left-1, j=right; do{ while(arr[++i] < pivot); while((i < j) && (pivot < arr[--j])); swap(arr[i], arr[j]); }while(i<j); swap(A[i],A[right]); return i; } inline int Partition(int* arr,int left,int right,int pivotindex){ swap(arr[pivotindex],arr[left]); int pivot = arr[left]; int i = left,j=right+1; while(ture){ while(arr[++i]<=pivot && i<right); while(arr[--j]>=pivot && j>left+1); if(i<j) swap(arr[i],arr[j]); else break; } swap(arr[j],arr[left]); return j; } //交换循环中要求对i,j索引有边界限制和qsort交换限制 //交换要求i<j //mid与pivot位置有关,pivot放在右边,则为i(第一个大于pivot的index);否则为j void qsort(int *arr,int left,int right){ if(left<right){ int pivotindex = findpivot(arr,left,right); int mid=Partition(A,left,right,pivotindex); qsort(A,left,mid-1); qsort(A,mid+1,right); } } merge_sort void merger(int arr[],int temparr[],int left,int mid,int right){ int l_pos=left; int r_pos=mid+1; int pos=left; while(l_pos<=mid&&r_pos<=right) { if(arr[l_pos]<arr[r_pos]) temparr[pos++]=arr[l_pos++]; else temparr[pos++]=arr[r_pos++]; } while(l_pos<=mid) { temparr[pos++]=arr[l_pos++]; } while(r_pos<=right) { temparr[pos++]=arr[r_pos++]; } while(left<=right) { arr[left]=temparr[left]; left++; } } void merge_sort(int arr[],int temparr[],int left,int right) { if(left<right){ int mid=(left+right)/2; merge_sort(arr,temparr,left,mid); merge_sort(arr,temparr,mid+1,right); merger(arr,temparr,left,mid,right); } } 二分法 原理:针对sortedArr,目标位于[left,right]之间,对middle搜索,right+1=left时终止。 ...

August 11, 2024 · 25 min · biglonglong

Git Record

前言 Git 是一个分布式版本控制系统,用于高效地管理代码版本历史和分支协作开发,主要概念有: 工作区(Working Directory):你当前正在编辑的文件 暂存区(Staging Area):你打算提交的文件 本地仓库(Local Repository):本地的历史提交记录 远程仓库(Remote Repository):如 GitHub、GitLab 上的共享仓库 开发者通常在本地频繁提交(commit),每次提交都会生成一个唯一的哈希值(SHA-1),确保代码历史不可篡改且可溯源。然后再推送( push)到远程仓库,团队成员也可拉取(pull)最新代码,借助分支机制(branch)并行开发功能,再合并/变基(merge/rebase),保持主线整洁有序。 ...

November 26, 2024 · 5 min · biglonglong

ROS2 Nav Plugin

规控 动态加载和卸载插件(ClassLoader加载动态链接库–抽象类子类),如控制器、传感器、规划器,下图所示: 几个规划消息: ros2 interface proto geometry_msgs/msg/PoseStamped 位置 header: stamp: sec: 0 nanosec: 0 frame_id: '' pose: position: x: 0.0 y: 0.0 z: 0.0 orientation: x: 0.0 y: 0.0 z: 0.0 w: 1.0 ros2 interface proto nav_msgs/msg/OccupancyGrid 栅格地图 ...

January 25, 2024 · 7 min · biglonglong

CSAPP

C程序生命周期 // hello.c #include <stdio.h> int main() { printf("Hello, World!\n"); return 0; } 一个C程序,一般需要经过编辑、编译、运行和退出几个步骤。编译阶段,我们通过如下命令得到可执行目标文件: gcc -o hello hello.c 可执行目标文件的后缀依系统而定,如Windows下.exe,Linux下.out。编译系统大致分为: ...

May 24, 2025 · 31 min · biglonglong

Cpp from 0 to 1

C++基础入门 C++ 初识 Hello World #include<iostream> using namespace std; int main() { cout << "Hello world" << endl; system("pause"); return 0; } 注释 在代码中加一些说明和解释,方便程序员阅读。编译器在编译代码时,会忽略注释的内容。 // 描述信息 :单行注释,放在一行代码的上方或者一条语句的末尾,对该行代码说明 /* 描述信息 */:多行注释,放在一段代码的上方,对该段代码做整体说明 变量 给一段指定内存空间起名,方便操作这段内存。创建变量时,最好初始化。 ...

March 28, 2025 · 16 min · biglonglong

Cpp MultiThreads

前言 多线程相关操作,Linux选择使用的是POSIX标准,而Windows自己搞了一套系统调用,称为Win32 API,意味着Linux与Windows存在标准差异,直接导致能在Linux中运行的程序未必能在Windows中运行。 ...

February 17, 2025 · 9 min · biglonglong

ROS2 Demo

前言 来自ROS2理论与实践 | ROS2讲义。事实上,作者也学习过ROS1,但由于工作需求、未来发展等原因,遂从头学起ROS2,理论方面ROS1和ROS2区别不大,但ROS2面向对象编程,而ROS1面向过程,ROS1选手可参考biglonglong/ROS1demo: Some demos for ROS1 basic operation。 流程 文件系统 WorkSpace --- 自定义的工作空间。 |--- build:存储中间文件的目录,该目录下会为每一个功能包创建一个单独子目录。 |--- install:安装目录,该目录下会为每一个功能包创建一个单独子目录。 |--- log:日志目录,用于存储日志文件。 |--- src:用于存储功能包源码的目录。 |-- C++功能包 |-- package.xml:包信息,比如:包名、版本、作者、依赖项。 |-- CMakeLists.txt:配置编译规则,比如源文件、依赖项、目标文件。 |-- src:C++源文件目录。 |-- include:头文件目录。 |-- msg:消息接口文件目录。 |-- srv:服务接口文件目录。 |-- action:动作接口文件目录。 |-- Python功能包 |-- package.xml:包信息,比如:包名、版本、作者、依赖项。 |-- setup.py:与C++功能包的CMakeLists.txt类似。 |-- setup.cfg:功能包基本配置文件。 |-- resource:资源目录。 |-- test:存储测试相关文件。 |-- 功能包同名目录:Python源文件目录。 -------------------------------------------- |-- C++或Python功能包 |-- launch:存储launch文件。 |-- rviz:存储rviz2配置相关文件。 |-- urdf:存储机器人建模文件。 |-- params:存储参数文件。 |-- world:存储仿真环境相关文件。 |-- map:存储导航所需地图文件。 |-- ...... 创建工作空间 ...

December 26, 2024 · 8 min · biglonglong