
C++数据结构和算法
华枝歌
这个人很神秘,他好像什么都会~
展开
-
基数排序(C/C++实现)
算法精髓(假设升序)将原数组按个位数字的大小进行桶排序,各个桶之间装着个位数相同的原数组内的元素将得到的各位有序的数组赋值给原数组。此时数组按个位数从小到大有序将数组再按十位数字的大小进行桶排序,各个桶之间装着十位数相同的原数组内的元素将得到的各位有序的数组赋值给原数组。此时数组按十位数从小到大有序将数组再按百位数字的大小进行桶排序,各个桶之间装着十位数相同的原数组内的元素将得到的各位有序的数组赋值给原数组。此时数组按百位数从小到大有序重复上述步骤,直到原数组内所有元素都以按照每一位数进行排原创 2022-03-29 21:16:17 · 930 阅读 · 0 评论 -
桶排序(C/C++实现)
算法精髓有一个元素均匀分布的原数组。创建多个临时数组将原数组内的元素按大小分层级装在不同的临时数组中在几个临时数组中分别排序将每一个临时数组中的值按大小转入原数组中。算法实现#include<iostream>#include<vector>#include<algorithm> using namespace std;void Bubble_sort(int arr[], int len){ if (len < 2)return;原创 2022-03-29 20:00:16 · 2655 阅读 · 0 评论 -
计数排序(C/C++实现)
算法精髓-遍历待排序数组,找出最大值与最小值,并计算其差值。创建临时数组,大小为其差值。再次遍历原数组,对遍历到的每一个值在临时数组中加一,记录原数组中该值出现了n次。将临时数组中不为0的值从小到大加上最小值输出n次。算法实现#include<stdio.h>#include<assert.h>#include<stdlib.h>//计数排序void CountSort(int* a, int len){ assert(a); //通过max和m原创 2022-03-28 17:58:39 · 628 阅读 · 0 评论 -
堆排序(C++实现)言简意赅版
算法精髓(假设升序排列)将待排序数组整合成一个完全二叉树。将二叉树构造成一个大根堆(即相邻两层上层元素总是大于下层元素)将根(即数组首元素)与树的尾节点(即数组末尾元素)值进行交换。这时最大元素到了数组末尾,叶节点的值较小的元素到了根处。将该较小元素通过元素下沉再次构造成大根堆选出数组中第二大元素,完成大根堆构造后再次与末尾节点交换位置。此时把第二大元素交换到了倒数第二个位置。重复上述步骤,直到完成排序代码实现与测试元素下沉函数的循环实现:#include<iostream>原创 2022-03-27 16:06:15 · 1546 阅读 · 0 评论 -
归并排序(C++实现)言简意赅版
算法精髓将一个无序长度为n的数列看成n个只有一个元素的数列,这n个元素都是有序的将n个子数列两两排序,得到n/2个有序的分别有两个元素的数列将n/2个子数列再两两排序,得到n/4个有序的子数列。重复上述步骤,最终得到一个有序数列算法实现(递归实现)#include<iostream>#include<algorithm>//44,3,38,5,47,15,36,26,27,2,46,4,19,50,48void Merge_sort_main(int arr[原创 2022-03-25 14:04:45 · 1666 阅读 · 0 评论 -
快速排序(C++实现)言简意赅版
算法精髓双指针进行首尾遍历,其中以首指针值为基准值,从尾开始向首遍历,当尾遇到小于基准的,便将其值赋予首,尾暂停。尾暂停后,首开始向尾遍历,当首遇到大于基准值的,便将其值赋予尾。首暂停。在首尾相遇之前,反复交替进行上述两个步骤,当首尾相遇时,首尾的值便是由其他值赋予而来,这时用基准值覆盖首尾相遇点的值。这时完成第一次排序,此时基准值左边的值皆小于基准值,基准值右边的值皆大于基准值。再以首到基准值和基准值到尾的区域内再次进行上述排序,直到每个区域间只有两个元素即两端的元素。算法实现void原创 2022-03-25 00:42:09 · 1469 阅读 · 0 评论 -
希尔排序(C++实现)
算法思想减少元素查找次数减少元素移动次数算法精髓(假设进行升序排序)一共有n个待排序元素。第一轮按每隔n = n/2 - 1个元素分为一组,划分为若干组。在每一组内各自用插入排序使各自组内元素有序。第二轮按n = n/2 - 1个元素再分为若干组,各组内进行组内排序直到n = 0时整个数组为一组,进行插入排序实现//数组首地址,数组长度,分组起始位置,步长void group_sort(int arr[], int length, int start, int step){原创 2022-03-22 18:11:37 · 1137 阅读 · 0 评论 -
插入排序(C++实现)言简意赅版
算法精髓(默认升序排序)像斗地主抽牌一样,以第一个元素为基准,将接下抽到的元素插入已排序元素中每次抽取未排序的元素中的第一个元素,比对其与前面已排序元素的大小关系记录下该元素的值在已排序区从后往前比对,当某元素大于该元素,则将该元素位置后移一位直到某元素小于该元素,则将该元素插入某元素的后一位,完成一轮插入从未排序区选择第一个元素,再次进行比对算法实现(第1种)void Insert_sort(int arr[], int length){ if (length < 2)ret原创 2022-03-22 17:06:19 · 2415 阅读 · 0 评论 -
选择排序(C++实现)言简意赅版
算法精髓(假设升序排列)每次比对为待选择区第一个元素。外层循环确定每一轮比对待选择元素数目内存循环遍历当前轮所有待选择元素,选择出最小元素:当元素小于第一个元素时记录其位置,以该位置元素作为当前轮暂时最小元素继续比对。比对完成后将最小元素角标对应元素值与第一个元素值交换。进行新一轮比对。一般实现:void Select_sort(int* arr, int length){ if (length < 2)return;//1个元素不需要排序 for (int i = 0;i &原创 2022-03-22 01:30:03 · 1190 阅读 · 0 评论 -
冒泡排序(C++实现)言简意赅版
算法分析冒泡排序每次只比对相邻两个,将较大值向后放(假设升序排列)。外循环规定每一轮遍历要比较的元素个数,内循环选出最大值当第一轮比对结束后,则数组末尾便是最大值,因此在后续排序中不需要再参与。选出最大值并放在末尾后,下一轮外循环便减少一个要比较的元素数目。内循环继续比较,再次选出最大值放在末尾。直到排序完成,即外循环中需要比较的元素清零。一般实现://普通实现:void Bubble_sort(int* arr, int length){ for (int i = length原创 2022-03-22 00:51:00 · 673 阅读 · 0 评论 -
二叉平衡树(C语言实现)超级简洁版
数据结构定义#define AVL_NODE_CHILE 0#define AVL_NODE_PARENT 1//平衡二叉树节点typedef struct avl_node{ int key;//关键字 avl_node* left;//左孩子 avl_node* right;//右孩子 int height;//节点高度}avl_node;//二叉树本身typedef struct avl{ //根节点 avl_node* root; int size;//节点数目原创 2022-03-21 00:14:27 · 940 阅读 · 0 评论 -
二叉搜索树(C语言实现)超级简洁版
数据结构设计#define BST_NODE_CHILD 0#define BST_NODE_PARENT 1//bst的节点typedef struct bst_node{ //关键字 int key; //左孩子 bst_node* left; //右孩子 bst_node* right;}bst_node;//bst树typedef struct bst{ //树的节点 struct bst_node* root; //记录树的节点数目 int size;}原创 2022-03-20 01:28:22 · 638 阅读 · 0 评论 -
二叉树(C语言实现)超级简洁版
数据结构设计//树的节点typedef struct tree_node{ struct tree_node* left; struct tree_node* right; char key;}tree_node;接口设计//创建一个节点tree_node* tree_create_node(char key);//创建一颗二叉树tree_node* tree_create();//前序遍历 |递归式|(中->左->右)void pre_order_travers原创 2022-03-18 01:41:10 · 1477 阅读 · 0 评论 -
哈希表(C语言实现)超级简洁版
数据结构设计//字典类型#define DICT_TYPE_INT 0#define DICT_TYPE_STR 1//键值对typedef struct dict_entry{ struct dict_entry* next; void* key; void* value;}dict_entry;typedef struct dict{ //哈希函数 unsigned int (*hash)(void* key); // table 数组存放 dict_entry 指针原创 2022-03-16 23:10:04 · 2777 阅读 · 0 评论 -
双链表(C语言实现)超级简洁版
数据结构设计//定义迭代器迭代方向#define LIST_START_HEAD 0#define LIST_START_TAIL 1//链表节点typedef struct list_node{ struct list_node* prev; struct list_node* next; void* value;}list_node;//链表typedef struct list{ unsigned int length; list_node* head; list_原创 2022-03-14 15:18:15 · 382 阅读 · 0 评论 -
队列(C语言实现)超级简洁版
数据结构设计//节点数据结构typedef struct queue_node{ queue_node* next; void* data;}queue_node;//队列数据结构typedef struct queue{ queue_node* head; queue_node* tail; int length;}queue;接口设计//创建队列queue* queue_create();//入队queue* queue_push(queue* queue,voi原创 2022-03-14 00:00:02 · 1423 阅读 · 0 评论 -
栈(C语言)超级简洁版
数据结构设计:typedef struct stack_node{ struct stack_node* next; void* data;}stack_node;typedef struct stack{ struct stack_node* top; int length;}stack;接口://创建栈stack* createStack();//入栈stack* stack_push(stack* stack, void* data);//出栈void* stac原创 2022-03-13 01:28:18 · 897 阅读 · 0 评论 -
链表(C语言)超级简洁版
数据结构设计://定义链表节点结构体: struct LinkedNode { int val; LinkedNode* next; LinkedNode(int val) :val(val), next(nullptr) {} }; //构造函数初始化链表 MyLinkedList() { //定义一个虚拟头节点 _size = 0; _dummyHead = new LinkedNode(0); }接口设计: int get(int index);//获取原创 2022-03-11 00:27:56 · 551 阅读 · 1 评论