![](https://img-blog.csdnimg.cn/2019110711373237.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Algorithm
xupeng1644
道阻且长,行则将至!
展开
-
排序算法性能和使用场景总结
按平均时间将排序分为四类:平方阶(O(n2))排序,一般称为简单排序,例如直接插入、直接选择和冒泡排序;线性对数阶(O(nlgn))排序,如快速、堆和归并排序;O(n1+£)阶排序,£是介于0和1之间的常数,即0<£<1,如希尔排序;线性阶(O(n))排序,如桶、箱和基数排序。影响排序效果的因素因为不同的排序方法适应不同的应用环境和要求,所以选择合适的排序方法应综合考虑...转载 2019-11-26 12:28:49 · 1357 阅读 · 0 评论 -
排序算法复杂度表
排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 插入 稳定 希尔 不稳定 选择 不稳定 堆 ...原创 2019-11-25 15:27:58 · 2764 阅读 · 1 评论 -
排序算法之十 希尔排序(C++版本)
一. 实现原理基数排序的相关知识,参考漫画:什么是希尔排序?二. 具体实现实现中,使用vector作为桶,只是从编码便利的角度出发。原创 2019-11-25 12:22:06 · 1404 阅读 · 0 评论 -
排序算法之九 基数排序(C++版本)
一. 实现原理基数排序的相关知识,参考漫画:什么是基数排序?二. 具体实现实现中,使用vector作为桶,只是从编码便利的角度出发。辅助函数// 获取data的位数int GetBitCount(int data){ int curCount = 0; while (data != 0) { ++curCount; data = data / 10; } retu...原创 2019-11-22 20:14:56 · 1724 阅读 · 0 评论 -
快速排序中pivot的选取策略
根据斯坦福算法专项课,pivot的选举方法有三种,分别为choose first、choose last、median of three,除此之外还可以进行随机选取,这也是快速排序为什么是一种随机化算法。1.choose first该种方式最为简单,只需返回子数组的第一个元素下标即可,下面为其实现://返回pivot下标 选择第一个元素private static int choosePi...原创 2019-11-22 09:28:25 · 3637 阅读 · 1 评论 -
快速排序中Partition算法总是从右边开始查找的原因
以一个例子来说明原因:有一个特定序列 :3 5 4 7以最左边的元素3为pivot, left指针先移动,指向元素5停止。right指针后移动,也指向元素原创 2019-11-21 23:35:43 · 1697 阅读 · 0 评论 -
排序算法之八 桶排序(C++版本)
一. 实现原理桶排序的相关知识,参考漫画:什么是桶排序?二. 具体实现实现中,使用vector作为桶,只是从编码便利的角度出发。因为需要对各个桶进行单独排序,所以,对桶进行的排序算法是否稳定,影响了整个算法的稳定性,这里使用的是sort算法,因此整个算法就是不稳定的。void BucketSort(int* pData, int size){ if (nullptr == pData...原创 2019-11-20 12:37:57 · 1818 阅读 · 0 评论 -
排序算法之七 计数排序(C++版本)
一. 实现原理计数排序的相关知识,参考漫画:什么是计数排序?二. 具体实现void CountSort(int* pData, int size){ if (nullptr == pData || size <= 0) return; int minData = pData[0]; int maxData = pData[0]; // 找出最小值最大值 for (int...原创 2019-11-19 18:14:47 · 1477 阅读 · 0 评论 -
排序算法之六 堆排序(C++版本)
一. 实现原理堆排序的相关知识,参考漫画:什么是堆排序? 堆排序算法(图解详细流程)二. 具体实现void InsertHeap(int* pData, int size){ // 自下向上的过程 if (nullptr == pData || size < 1) return; for (int idx = 0; idx < size; ++idx) { in...原创 2019-11-19 13:56:50 · 1306 阅读 · 0 评论 -
排序算法之五 快速排序(C++版本)
一. 实现原理快速排序的相关知识,参考漫画:什么是快速排序?二. 具体实现1. 挖坑法2.指针交换法原创 2019-11-19 09:54:50 · 1411 阅读 · 0 评论 -
排序算法之四 归并排序(C++版本)
一. 实现原理插入排序的相关知识,参考漫画:什么是归并排序?二. 具体实现void Merge(int* pData, int* pTemp, int start, unsigned int middle, unsigned int end){ unsigned int start1 = start, end1 = middle; // 第一个序列的起止位置 unsigned int...原创 2019-11-18 16:00:10 · 1539 阅读 · 0 评论 -
排序算法之三 选择排序(C++版本)
选择排序的相关知识,参考漫画:什么是选择排序?实现如下:void SelectSort(int* pData, int size){ if (nullptr == pData || size <= 0) return; for (int idx = 0; idx < size - 1; ++idx) // idx为每轮的选择集合的起始位置,注意结束位置为size - 1 ...原创 2019-11-18 12:05:55 · 1441 阅读 · 0 评论 -
排序算法之二 插入排序(C++版本)
插入排序的相关知识,参考漫画:什么是插入排序?插入排序有两个版本:第一个版本每次void InsertSort(int* pData, int size){ if (nullptr == pData || size <= 0) return; for (int idx = 1; idx < size; ++idx) // idx为每轮待插入数据的下标 { int t...原创 2019-11-17 11:18:44 · 1338 阅读 · 0 评论 -
排序算法之一 冒泡排序(C++版本)
冒泡排序的相关知识,参考冒泡排序 程序员小灰下面是具体实现:辅助函数:void Print(int* pData, int size){ for (int idx = 0; idx < size; ++idx) std::cout << pData[idx] << " "; std::cout << std::endl;}初始数据为:i...原创 2019-11-16 17:56:15 · 1503 阅读 · 0 评论 -
排序算法复杂度比较
常用的排序算法的复杂度情况和稳定性如下表记忆:插入希尔 选择堆 冒泡快排 归并基数转载自:http://blog.chinaunix.net/uid-21457204-id-3060260.html转载 2015-10-06 14:06:31 · 365 阅读 · 0 评论 -
归并排序(链表结构)
如果需要归并的两个有序对象都是通过链表实现的,可以使用递归的方式进行归并。链表节点struct ListNode{ int nData; ListNode* pNext;};归并排序ListNode* MergeSort(ListNode* pHead1, ListNode* pHead2){ if (NULL == pHead1) return pHe原创 2015-10-06 10:22:34 · 387 阅读 · 0 评论 -
快速排序QuickSort
快速排序是基于划分的排序。具体过程就不表了。划分算法int Partition(int* pData, int begin, int end){ if (NULL == pData || begin >= end) return -1; int pivot = begin; int front = begin; int back = end; while (fron原创 2015-10-06 09:03:03 · 246 阅读 · 0 评论 -
插入排序InsertSort
插入排序,InsertSort, 排序算法,简单原创 2015-08-13 23:21:30 · 525 阅读 · 0 评论 -
选择排序SelectSort
选择排序,SelectSort, 排序算法原创 2015-08-13 22:26:30 · 367 阅读 · 0 评论 -
冒泡排序BubbleSort
冒泡排序,Bubble Sort, 排序算法,最为简单的排序算法!原创 2015-08-13 21:31:43 · 451 阅读 · 0 评论 -
归并排序MergeSort
归并排序MergeSort归并算法Merge原创 2015-08-09 09:26:23 · 385 阅读 · 0 评论 -
堆排序HeapSort
堆排序原创 2015-08-08 17:25:12 · 602 阅读 · 0 评论 -
查找算法之变种二分查找(C++版本)
1 查找第一个等于目标值的元素2 查找最后一个等于目标值的元素3 查找第一个大于等于目标值的元素4 查找最后一个小于等于目标值的元素代码实现:int search1(int* pData, int size, int destData) // 查找第一个等于目标值的元素{ if (nullptr == pData || size <= 0) return -1; int b...原创 2020-02-06 14:26:28 · 1401 阅读 · 0 评论 -
查找算法之六 哈希查找(C++版本)
算法介绍:哈希算法应该不算是算法,而算是一种数据结构的应用。向将数据放入哈希表中,然后再进行查找。成员函数介绍:NewHashTable(int destSize)构造一个destSize大小的数组m_pData,同时将其元素值都设置为INT_MAX,表示该位置未被使用。bool NeedRehash()判断负载因子,如果负载因子为1,就需要进行ReHash。void Insert...原创 2019-12-02 12:48:17 · 2720 阅读 · 0 评论 -
查找算法之五 分块查找(C++版本)
算法介绍:以升序为例,分块查找是将待查找数组分成多个小块,使当前块中所有元素都比前一个块中数据大,当前块中所有元素都比后一个块中书友数据小。然后创建一个索引表,用来存储各个块的起始位置和最大元素值。查找时,先在索引表中找到应该查找的具体块,然后在找到的块中进行顺序查找。查找步骤:将数组分成多个小块,使各个块保持"块内无序,块间有序"。根据各个块创建索引表。查询索引表,找到目标块。在目标...原创 2019-11-29 15:39:41 · 1997 阅读 · 0 评论 -
斐波那契查找算法中为什么需要把数组长度扩充到f[k]-1而不是f[k]或者f[k+1]
这是斐波那契查找的理解难点。这是为了能正确递归计算mid值,看下图可发现 f[k]-1 = (f[k-1] + f[k-2]) - 1 = (f[k-1]-1) + 1 + (f[k-2]-1),中间的1就是我们二分的锚点mid,如果目标在左区,数组长度就缩到(f[k-1]-1),如果在右区,数组长度就缩到(f[k-2]-1),否则就等于mid完成查找。而(f[k-1]-1)又能拆成(f[k-2...转载 2019-11-29 11:03:24 · 1655 阅读 · 0 评论 -
查找算法之四 斐波那契查找(C++版本)
斐波那契查找算法介绍:斐波那契搜索就是在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于略大于查找表中元素个数的数F[n],将原查找表扩展为长度为Fn,完成后进行斐波那契分割,即F[n]个元素分割为前半部分F[n-1]个元素,后半部分F[n-2]个元素,找出要查找的元素在那一部分并递归,直到找到。查找步骤:同二分查找实现代码:void GetFibonacciArr...原创 2019-11-29 10:42:25 · 1981 阅读 · 0 评论 -
查找算法之三 插值查找(C++版本)
算法介绍:插值算法对二分查找的改进算法,二分查找中,每次都取当前区间的中位数作为比较对象。中间值下标middle的计算公式为:middle = (left + right) / 2; // 或者middle = left + (right - left) / 2;插值算法对这个计算公式进行了改进,改进后middle更接近与被查询值,可以有效地减少比对次数,提升查询效率。middle=le...原创 2019-11-28 14:39:39 · 1615 阅读 · 0 评论 -
查找算法之二 二分查找(C++版本)
查找步骤:将当前元素区间根据中间值划分成左右两个区间。然后用中间值与目标值进行比较。如果目标值等于该中间值,找到直接返回。如果目标值比中间值大,则继续在右边区间查找。如果目标值比中间值小,在继续在左边区间查找。注意事项:二分查找又叫折半查找,要求当前区间必须已经有序。代码实现:循环形式int BinarySearch(int* pData, int size, int va...原创 2019-11-28 13:10:54 · 1487 阅读 · 0 评论 -
查找算法之一 顺序查找
步骤:依次比对每一个元素,直到找到或者没有该元素。注意:顺序查找是唯一一个对元素是否有序无要求的排序算法。代码:int SequenceSearch(int* pData, int size, int value){ if (nullptr == pData || size < 1) return; for (int idx = 0; idx < size; ++idx)...原创 2019-11-28 12:19:12 · 1551 阅读 · 0 评论 -
用两个队列实现栈
同样,一个主队列,一个从队列。从队列作数据中转用。队列直接使用STL中的queue。源代码:NewStack.h#include class NewStack{public: void Pop(); void Push(int data); int Top(); bool Empty();private: std::queue m_queue1;原创 2015-09-29 20:57:51 · 301 阅读 · 0 评论 -
链表最小结构(C++版本)
链表节点类型为ListNode,链表类型为MyList。涉及的操作为:插入链表:void InsertList(MyList& myList, int newData);打印链表:void PrintList(MyList& myList);销毁链表:void ReleaseList(MyList& myList);#include <iostream&...原创 2019-11-27 17:36:50 · 1476 阅读 · 0 评论 -
全排列算法
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。公式:全排列数f(n)=n!(定义0!=1)递归版本步骤:在一个位置上选定一个元素,然后递归进入选择下一个元素,直到当前位置等于最后的位置。#include <iostream>#include <cstdlib>...原创 2019-11-27 09:33:52 · 1710 阅读 · 0 评论 -
组合算法
即在n个数据中选择1、2、3…知道n个数据。代码如下:#include <iostream>#include <cstdlib>void PrintData(int* pData, int begin, int end){ for (int idx = begin; idx <= end; ++idx) { std::cout << p...原创 2019-11-26 19:39:09 · 2871 阅读 · 0 评论 -
28. (附加)八皇后问题(C++版本)
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?使用回溯法,总共92种摆法。判断当前行destRow的赋值是否满足条件:(假定其他行为curRow)不在同一行:肯定不在同一行,因为是按照行来进行赋值的。不在同一列:pData[curRow] != pData[destRow]不在对角线上:std::abs(pDa...原创 2019-11-26 12:53:22 · 1437 阅读 · 0 评论 -
详解布隆过滤器
今天碰到个业务,他的 Redis 集群有个大 Value 用途是作为布隆过滤器,但沟通的时候被小怼了一下,意思大概是 “布隆过滤器原理都不懂,还要我优化?”。技术菜被人怼认了、怪不得别人,自己之前确实只是听说过这个,但是没深入了解过,趁这个机会补充一下知识。在进入正文之前,之前看到的有句话我觉得说得很好:Data structures are nothing different. They ...转载 2019-11-05 09:38:15 · 1395 阅读 · 0 评论 -
LRU原理和Redis实现
很久前参加过今日头条的面试,遇到一个题,目前半部分是如何实现 LRU,后半部分是 Redis 中如何实现 LRU。我的第一反应是操作系统课程里学过,应该是内存不够的场景下,淘汰旧内容的策略。LRU … Least Recent Used,淘汰掉最不经常使用的。可以稍微多补充两句,因为计算机体系结构中,最大的最可靠的存储是硬盘,它容量很大,并且内容可以固化,但是访问速度很慢,所以需要把使用的内容载...转载 2019-11-04 17:55:56 · 1436 阅读 · 0 评论 -
分布式ID生成之雪花算法
分布式ID生成之雪花算法 分布式唯一ID的方案有很多,本文主要讨论了雪花算法,组成结构大致分为了无效位、时间位、机器位和序列号位。 唯一ID可以标识数据的唯一性,在分布式系统中生成唯一ID的方案有很多,常见的方式大概有以下三种: 依赖数据库,使用如MySQL自增列或Oracle序列等。 UUID随机数 ...转载 2019-10-29 16:12:54 · 2539 阅读 · 0 评论 -
一致性哈希(hash)算法
一、算法背景一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用。 二、应用场景现在一致性hash算法在分布式系统中也得到了广泛应用,分布式系统中涉及到集群部...转载 2019-10-22 20:34:38 · 1582 阅读 · 0 评论