![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
排序算法
Binary Oracle
一名热爱开源和技术的Coder , 开源框架spring committer , golang开源网络库netpoll committer; (脱产备战25考研中,停更一年)
展开
-
小白也能看懂的归并排序!!!
1.前言归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。#include<iostream>using namespace std;#include<algorithm>//合并两个有序数组vo原创 2021-04-16 19:33:31 · 395 阅读 · 15 评论 -
小白也能看懂的基数排序!!!
基数排序介绍:基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用基数排序法是属于稳定性的排序,基数排序法是效率高的稳定性排序法。基数排序(Radix Sort)是桶排序的扩展,它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序图解过程基数排序具体思想将所有待比较数值统一为同样的数位长度,数位原创 2021-04-12 21:39:42 · 295 阅读 · 6 评论 -
快速排序的优化思路
在对快速排序进行优化前,先让我们回顾一些快速排序的思想:快速排序就是分而治之思想的体现,将有序序列分成对立的两部分,一部分值都比关键字值小,一部分值都比关键字值大,再分别对两部分进行排序对快速排序不了解的可以先看看快速排序的具体过程和代码讲解下面来看代码:#include<iostream>#include<algorithm>using namespace std;//该函数作用:把比关键字小的放到关键字的左边,比关键字大的放到关键字右边int partition(原创 2021-04-10 21:32:44 · 914 阅读 · 2 评论 -
冒泡排序,选择排序,插入排序,折半插入排序
今天我们来聊聊简单算法:冒泡,简单选择,直接插入1.冒泡排序:冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录的为止,这里的反序指的是不符合当前指定排序规则的数字(1)对数组做交换排序(冒泡排序初级版)//冒泡排序初级版---升序void BubbleSort(int arr[],int len){ for (int i = 0; i < len-1; i++) { for (int j = i + 1; j <= len原创 2021-04-08 17:09:46 · 631 阅读 · 10 评论 -
归并排序
归并排序基本原理:归并排序利用分治法的思想,具体算法框架如下:step1: 将待排序列 A 分为两个子序列,再将子序列一分为二,一直分到每个子序列只含有一个元素为止,这个时候,每个子序列(都只包含一个元素)已经是有序的。step2: 根据分解的路径,对每一对子序列进行排序step3: 将已经排序的两个子序列合并,最后合成整个序列。图解:整个合并流程:递归写法:1.对数组arr进行递归排序#include<iostream>using namespace std;#d原创 2021-04-07 22:02:21 · 216 阅读 · 0 评论 -
堆排序
注释解释的完整堆排序代码#include<iostream>#include<algorithm>using namespace std;//调整为大顶堆//i这里是非叶子节点下标void HeapAdjust(int arr[],int i,int len){ int temp = NULL;//temp这里用来保存可能会被替换掉的根节点,防止被替换掉之后,无法找回替换前的根节点 temp = arr[i];//保存当...原创 2021-04-05 21:00:30 · 313 阅读 · 0 评论 -
希尔排序
希尔排序是对插入排序的改进算法,主要针对插入排序需要在数组基本有序或者数量较少时才会效率较高的这两个限制进行改进希尔排序基本思想希尔排序的过程图解如何分割待排序记录?子序列内如何进行直接插入排序?算法描述:直接插入排序个希尔排序的对比时间性能手绘图解加上完整代码下面就是重复上述步骤,这里不做演示了#include<iostream>using namespace std;//希尔排序void shellSort(int arr[],i原创 2021-04-04 21:03:53 · 152 阅读 · 0 评论 -
散列表
散列函数五种设计方法1.直接地址法2.除留余数法3.数字分析法4.平方取中法5,折叠法同理:在处理不同情况时,如果有更优解的散列函数,我们也可以自己进行设计处理冲突的方法1.开放定址法(1)线性探测法(2)二次探测法(3) 随机探测法总结:这上面三种方法都是在同一个数组中进行处理,没有超过数组的范畴,改变的都是d的取值方式2. 拉链法如何理解拉链法,下面举一个例子:散列表性能分析...原创 2021-04-03 22:49:48 · 178 阅读 · 1 评论 -
平衡二叉树
定义最小不平衡子树基本思想构造平衡二叉树二叉平衡树调整的四种类型总结原创 2021-04-03 13:37:33 · 184 阅读 · 0 评论 -
二叉排序树的删除
被删除的节点是叶子节点被删除的节点的左子树或者右子树为空被删除的节点的左右子树均不为空伪代码删除叶子节点:删除没有右子树的节点:左子树同理删除左右子树都有的节点:完整代码:#include<iostream>using namespace std;struct BiNode { int data; BiNode* lchild; BiNode* rchild; BiNode(int key):data(key),lchild(NULL),rc原创 2021-04-01 22:27:00 · 1088 阅读 · 1 评论 -
二叉排序树的查找
二叉排序树的查找过程二叉排序树查找的伪代码第一种写法://递归三要素://1.结束条件:未找到 找到//2.递归内容:比较大小,决定去左还是右子树里面查找//3.返回值:没找到,返回双亲节点 找到,返回对应节点BiNode* searchBST(BiNode* root, int key){ if (root == NULL) return root; if(root->data==key) return root; return key<(root->原创 2021-04-01 19:39:40 · 2299 阅读 · 0 评论 -
二叉排序树的创建和插入----二叉查找树
二叉排序树概念c++类的定义二叉排序树的插入二叉排序树的构造下面演示两种不同的方式实现二叉树的插入和构建法1:原创 2021-04-01 17:15:08 · 992 阅读 · 0 评论 -
快速排序
定义:选取轴值的方法:原创 2021-03-17 21:25:00 · 199 阅读 · 0 评论 -
二分查找---折半查找
注意:查找的前提必须是有序数组或者容器思想:定义llow为顺序表最左端元素位置,high为顺序表右端元素位置。定义mid = (low+high) / 2,即顺序表的中间位置,然后用所查找的值与mid所在位置处的值比较,由于列表有序,若所查找的值比mid小,则只需在表的前半部分查找,否则只需在表的后半部分查找(若第一次比较就发现两值相等则直接返回当前值所在的位置),以此类推,直至查找到所寻找的值或确定所查找的值不在该列表内为止(即查找失败)。有序数组中没有重复元素的情况下#include<原创 2021-03-12 16:19:15 · 158 阅读 · 0 评论 -
插入排序
#include<iostream>using namespace std;//插入排序void insertSort(int arr[],int len){ //i一开始记录数组中第一个元素的位置 for (int i = 1; i < len; i++) { int j = i - 1;//j记录i后面一个元素的位置 int temp = arr[i];//临时值,每次循环用来保存i记录的元素位置 //如果temp指向的元素大于j指向的元素,就不改变位置,..原创 2021-03-06 12:00:28 · 294 阅读 · 3 评论