
算法
文章平均质量分 69
大彤小忆
永远不要停下前进的脚步^o^
展开
-
十大排序算法总结
排序方法最好时间复杂度最坏时间复杂度平均时间复杂度辅助空间复杂度稳定性博客链接直接插入排序O(n)O(n)O(n)O(n2)O(n^{2})O(n2)O(n2)O(n^{2})O(n2)O(1)O(1)O(1)稳定插入排序算法折半插入排序O(n)O(n)O(n)O(n2)O(n^{2})O(n2)O(n2)O(n^{2})O(n2)O(1)O(1)O(1)稳定折半插入排序算法直接选择排序O(n2)O(n^{2})O(n2)O(n2)O(n...原创 2021-05-15 10:24:36 · 2936 阅读 · 3 评论 -
大O表示法
1. 算法的运行时间以不同的速度增加2. 理解不同的大O运行时间3. 大O表示法指出了最糟情况下的运行时间4. 一些常见的大O运行时间 大O表示法是一种特殊的表示法,指出了算法的速度有多快。1. 算法的运行时间以不同的速度增加 对于简单查找算法和二分查找算法,假设检查一个元素需要1毫秒,在列表包含100个元素的情况下,简单查找算法必须检查100个元素,因此需要100毫秒;而二分查找算法只需要检查7个元素(log2100log_{2}100log2100大约等于7),因此需要7毫秒就能查找完毕。.原创 2021-06-10 10:19:24 · 1269 阅读 · 0 评论 -
基数排序算法
基数排序(Radix Sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,是桶排序的扩展。将要排序的元素分配至某些“桶”中,藉以达到排序的作用。基数排序法是属于稳定性的排序,其效率高于其它的稳定性排序法。 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。 基数排序的排序思路:先原创 2021-06-07 18:09:16 · 1116 阅读 · 0 评论 -
桶排序算法
桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(O(n))(O(n))(O(n))。 桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到以下两点: 1. 在额外空间充足的情况下,尽量增大桶原创 2021-06-07 12:17:12 · 1035 阅读 · 0 评论 -
计数排序算法
计数排序(Counting Sort)是一个非基于比较的排序算法,该算法的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。它的优势在于在对一定范围内的整数排序时,它的复杂度为O(n+k)Ο(n+k)O(n+k)(其中k是整数的范围),快于任何比较排序算法。 当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(n∗log(n))O(k)>O(n*log(n))O(k)>O(n∗log(n))的时原创 2021-06-07 10:17:27 · 1079 阅读 · 0 评论 -
堆排序算法
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列。 算法: 把未排序的数据一个一个放入堆里,然后再一个一个取出来。 例如: 使用堆排序算法将数组 { 4,2,原创 2021-06-01 16:22:20 · 1413 阅读 · 0 评论 -
归并排序算法
归并排序(Merge sort)是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列; 第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置; 第三步:比较两个指原创 2021-05-13 20:49:13 · 3517 阅读 · 0 评论 -
希尔排序算法
希尔排序(Shell’s Sort)是插入排序的一种,又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。 希尔排序是基于插入排序的以下两点性质而提出改进方法的:插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效原创 2021-05-12 21:59:35 · 2627 阅读 · 0 评论 -
折半插入排序算法
折半插入排序(Binary Insertion Sort)是对插入排序算法的一种改进。所谓插入排序,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。 具体操作: 在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high]。将待插入元素与a[mid](其中mid=low+(high-low)/2)相比较,如果比参考元素小,则选择a[原创 2021-05-12 17:34:05 · 20149 阅读 · 4 评论 -
快速排序算法
快速排序(Quick sort)是对冒泡排序算法的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 快速排序算法是最流行的排序算法,也是速度最快的排序算法。 快速排序算法通过多次比较和交换来实现排序,其排序流程如下:首先设定一个分界值,通过该分界值将数组分成左右两部分;将大于或等于分界值的数据集中到数组右边,小于分原创 2021-05-11 23:03:26 · 6364 阅读 · 0 评论 -
插入排序算法
插入排序(Insertion sort)一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。 插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的原创 2021-05-11 11:49:46 · 6852 阅读 · 1 评论 -
递归算法
1. 递归算法概述2. 利用递归算法计算阶乘3. 利用递归算法实现二分查找4. 利用递归算法进行排列组合1. 递归算法概述 程序调用自身的编程技巧称为递归(recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的能力在于用有限的语句来定义对象的无限集合。一.原创 2021-05-10 22:08:14 · 10372 阅读 · 4 评论 -
二分查找算法
二分查找(Binary Search)也称折半查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 查找过程: 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 算法要求:原创 2021-05-09 20:40:51 · 3065 阅读 · 0 评论 -
为防止整数溢出问题,使用low + (high - low) / 2而不是(high + low) / 2
在实现二分法时,为什么使用low + (high - low) / 2,而不使用(high + low) / 2呢?目的是为了防止溢出! 使用(low+high)/2会有整数溢出的问题,问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)不存在这个问题。 例如,high = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824 lo原创 2021-05-09 20:28:37 · 3245 阅读 · 0 评论 -
顺序查找算法
顺序查找是按照序列原有顺序对数组进行遍历比较查询的基本查找算法。基本原理:对于任意一个序列以及一个给定的元素,将给定元素与序列中元素依次比较,直到找出与给定关键字相同的元素,或者将序列中的元素与其都比较完为止。 对于没有排序的数据,只能使用顺序查找;如果数据已经排好序,可以使用速度比较快的折半查找(二分查找)。 例如: 在数组 { 4,2,8,0,5,7,1,3,6,9 } 中查找元素7。 实现代码如下所示。#include<iostream>using namespace原创 2021-05-09 16:55:53 · 5494 阅读 · 0 评论 -
冒泡排序算法和选择排序算法比较
冒泡排序算法内容详情→冒泡排序算法。 选择排序算法内容详情→选择排序算法。 冒泡排序算法和选择排序算法的区别:冒泡排序是比较相邻位置的两个数;而选择排序是按顺序比较,找出最大值或者最小值。冒泡排序扫描一遍数组,位置不对需要不停地互换位置;而选择排序扫描一遍数组,只需要换一次位置,所以一般来说选择排序比冒泡排序效率高。冒泡排序是通过数去找位置;而选择排序是给定位置去找数。 冒泡排序算法的优缺点: 优点:比较简单,空间复杂度较低,是稳定的; 缺点:时间复杂度太高,效率慢原创 2021-05-09 12:08:45 · 5473 阅读 · 0 评论 -
选择排序算法
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 选择排序就是从当前未排序的整数中找一个最小的整数,将它放在已排序的整数列表的最后。 要点: 比较相邻的两个数,如果左边的数大于右边的数,就进行交换。 例如: 将数组 { 4,2,8,0原创 2021-05-09 11:49:01 · 8878 阅读 · 0 评论 -
冒泡排序算法
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。...原创 2021-05-09 10:07:47 · 2798 阅读 · 0 评论 -
交换算法
交换(swap)算法是最基本的算法。在C/C++中共有以下四种方法实现交换算法:传指针实现:void swap(int *p1, int *p2);宏定义实现:#define SWAP(x,y,t)((t)=(x),(x)=(y),(y)=(t));传引用实现:void swap (int &a, int &b);函数模板实现:template<class T> void swap(T &a, T &b)。 在C语言中,只能使用前两种方法实现交原创 2021-04-29 16:22:36 · 3539 阅读 · 0 评论 -
数据结构与算法
1. 数据结构2. 算法3. 数据结构与算法的区别与联系1. 数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 数据结构主要研究非数值计算问题程序中的操作对象以及它们之间的关系,不是研究复杂的算法。 数据结构中的基本概念:数据: 程序的操作对象,用于描述客观事物。数据是能输入计算机且能被计算机.原创 2021-04-28 22:19:21 · 3595 阅读 · 0 评论