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

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

Cpp CheatSheet

常用头 头文件 标准c头文件 说明 标准c头文件 说明 标准c头文件 说明 assert.h 断言相关 ctype.h 字符类型判断 errno.h 标准错误机制 float.h 浮点限制 limits.h 整形限制 locale.h 本地化接口 math.h/cmath 数学函数 setjmp.h 非本地跳转 signal.h 信号相关 stdarg.h 可变参数处理 stddef.h 宏和类型定义 stdio.h/cstdlib 标准I/O stdlib.h 标准工具库 string.h/cstring 字符串和内存处理 time.h 时间相关 cstdio c标准IO using namespace std; STL头文件 说明 STL头文件 说明 STL头文件 说明 algorithm 通用算法 deque 双端队列 vector 向量 iterator 迭代器 stack 栈 map 图(键值对) list 列表 string 字符串 set 集合 queue 队列 bitset bit类 numeric 数值算法 iostream C++标准IO bitset C++标准位序列 宏定义 ...

July 11, 2024 · 13 min · biglonglong

Work Specification

系统初始化 Windows 磁盘分区 用途 D:\ 应用程序 E:\ 数据缓存、临时文件 USB flash drive 便携资料 Google Chrome:log in、setting Extensions:划词翻译、OneTab、Tab Copy、GitZip for github BookMark:AIs(ChatGPT、Claude、Microsoft Copilot、DeepSeek、文心一言)、GitHub、龙犊&小窝🪹~、LeetCode、小林coding VS Code:log in、save on focusChange ...

April 13, 2024 · 4 min · biglonglong