常见十大算法

article/2025/9/13 11:32:06

优劣术语
- 稳定性 原本ab前,a=b,排序之后位置任然不变。不稳定性则相反
- 内排序 所有排序都在内存中完成。外排序数据放磁盘,排序通过磁盘内存的数据传输
- 事件复杂度 算法执行耗费的时间
- 空间复杂度 算法执行耗费的内存
算法
In/out-place: 不占/占额外内存

  1. 冒泡排序:

- 比较相邻的元素。如果第一个比第二个大,就交换它们两个
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数
- 针对所有的元素重复以上的步骤,除了最后一个
- 重复步骤1~3,直到排序完成
- console.time()/timeEnd(),相同参数即可显示之间的时间
function sortArray(arr) {let tmp;for (let i = 0; i < arr.length-1;i++) {for(let j = 0 ; j < arr.length-1;j++){if(arr[j] > arr[j+1]){tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}
}

改进1:设置标志位pos,每一层排完序之后,就记录排到最大的哪一位在什么位置,因为每一层最大的数就是它所在数组的倒数的位数,下一次就没必要再循环一遍

function sortArray(arr) {let i = arr.length-1;while(i > 0) {var pos = 0;for(let j = 0 ; j < i;j++){if(arr[j] > arr[j+1]){pos = j;var tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}i = pos;}
}

改进2:每趟排序从正反向冒泡一次得到两个最终值(最大和最小值),排序次数几乎减少一半

function sortArray(arr) {let low = 0;let high = arr.length-1;while(low < high) {for (var i = low; i < high; i++) {if (arr[i] > arr[i+1]) {var tmp = arr[i];arr[i] = arr[i+1];arr[i+1] = tmp;}}--high;for(let j = high ; j > low ;j--){if(arr[j] < arr[j-1]){var tmp = arr[j];arr[j] = arr[j-1];arr[j-1] = tmp;}}++low;}
}

冒泡

  1. 选择排序:

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

function sortArray(arr) {for (let i = 0; i < arr.length-1;i++) {let pos = i;for(let j = i +1; j < arr.length;j++){if(arr[pos] > arr[j]){pos = j;}}let tmp = arr[i];arr[i] = arr[pos];arr[pos] = tmp;}
}

选择

  1. 插入排序:

从第一个元素开始,该元素可以认为已经排好序,取下一个,在已经排好序的序列中向前扫描,有元素大于这个新元素,将已经在排好序中的元素移到下一个位置,依次执行

function sortArray(arr){for (var i = 1; i < arr.length; i++) {var tmp = arr[i];for(var j = i -1; j>=0 && arr[j] > tmp; j--){arr[j+1] = arr[j];}arr[j+1] = tmp;}
}

改进:插入时使用二分查找

function sortArray(arr){for (var i = 1; i < arr.length; i++) {var tmp = arr[i],left=0,right=i-1;while (left <= right) {var mid = parseInt((left+right)/2);if (tmp < arr[mid] ) {right = mid -1;}else {left = mid +1;}}for(var j = i -1; j>=left; j--){arr[j+1] = arr[j];}arr[left] = tmp;}
}

插入

  1. 希尔排序:

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序

function sortArray(arr){var len = arr.length,tmp,gap =1;while(gap < len/4){ //定义间隔序列gap = gap*4 +1;}for (gap; gap > 0; gap = Math.floor(gap / 4 )) {for(var i = gap; i< len;i++){tmp = arr[i];for (var j = i - gap; j >= 0 && arr[j] > tmp; j -= gap) {arr[j + gap] = arr[j];}arr[j + gap] = tmp;}	}
}

希尔

  1. 归并排序:

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序

function mergeSort(arr) {var len = arr.length;if(len < 2){return arr;}var middle = Math.floor(len/2),left = arr.slice(0, middle),right = arr.slice(middle);return merge(mergeSort(left),mergeSort(right));
}
function merge(left,right){var result =[];while(left.length && right.length){if (left[0] <= right[0]) {result.push(left.shift());}else {result.push(right.shift());}}while (left.length) {result.push(left.shift());}while (right.length) {result.push(right.shift());}return result;
}

归并

  1. 快速排序:

function sortArray(a){if (a.length <=1) {return a;}var num = Math.floor(a.length/2);var centerVal = a.splice(num,1); //获取中间值var left =[];var right =[];for (var i = 0; i < a.length; i++) {if (a[i] < centerVal) {left.push(a[i]);}else {right.push(a[i]);}}return sortArray(left).concat(centerVal,sortArray(right));
}

快排

  1. 堆排序:

近似完全二叉树个数为:2n-1,同时满足子节点的键值或索引总是小于或大于它的父节点

function heapSort(array) {if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {//建堆var heapSize = array.length, temp;for (var i = Math.floor(heapSize / 2) - 1; i >= 0; i--) {heapify(array, i, heapSize);}//堆排序for (var j = heapSize - 1; j >= 1; j--) {temp = array[0];array[0] = array[j];array[j] = temp;heapify(array, 0, --heapSize);}return array;} else {return 'array is not an Array!';}
}
/*方法说明:维护堆的性质
@param  arr 数组
@param  x   数组下标
@param  len 堆大小*/
function heapify(arr, x, len) {if (Object.prototype.toString.call(arr).slice(8, -1) === 'Array' && typeof x === 'number') {var l = 2 * x + 1, r = 2 * x + 2, largest = x, temp;if (l < len && arr[l] > arr[largest]) {largest = l;}if (r < len && arr[r] > arr[largest]) {largest = r;}if (largest != x) {temp = arr[x];arr[x] = arr[largest];arr[largest] = temp;heapify(arr, largest, len);}} else {return 'arr is not an Array or x is not a number!';}
}

堆排序

  1. 计数排序:

使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数,然后根据数组C来将A中的元素排到正确的位置,它只能对整数进行排序

function countingSort(array) {var len = array.length,B = [],C = [],min = max = array[0];for (var i = 0; i < len; i++) {min = min <= array[i] ? min : array[i];max = max >= array[i] ? max : array[i];C[array[i]] = C[array[i]] ? C[array[i]] + 1 : 1;}for (var j = min; j < max; j++) {C[j + 1] = (C[j + 1] || 0) + (C[j] || 0);}for (var k = len - 1; k >= 0; k--) {B[C[array[k]] - 1] = array[k];C[array[k]]--;}return B;
}

计数

  1. 桶排序:

\- 设置一个定量的数组当作空桶
\- 遍历输入数据,并且把数据一个一个放到对应的桶里去
\- 对每个不是空的桶进行排序
\- 从不是空的桶里把排好序的数据拼接起来
/*方法说明:桶排序
@param  array 数组
@param  num   桶的数量*/
function bucketSort(array, num) {if (array.length <= 1) {return array;}var len = array.length, buckets = [], result = [], min = max = array[0], regex = '/^[1-9]+[0-9]*$/', space, n = 0;num = num || ((num > 1 && regex.test(num)) ? num : 10);for (var i = 1; i < len; i++) {min = min <= array[i] ? min : array[i];max = max >= array[i] ? max : array[i];}space = (max - min + 1) / num;for (var j = 0; j < len; j++) {var index = Math.floor((array[j] - min) / space);if (buckets[index]) {   //  非空桶,插入排序var k = buckets[index].length - 1;while (k >= 0 && buckets[index][k] > array[j]) {buckets[index][k + 1] = buckets[index][k];k--;}buckets[index][k + 1] = array[j];} else {    //空桶,初始化buckets[index] = [];buckets[index].push(array[j]);}}while (n < num) {result = result.concat(buckets[n]);n++;}return result;
}

桶

  1. 基数排序:

\- 取得数组中的最大数,并取得位数
\- arr为原始数组,从最低位开始取每个位组成radix数组
\- 对radix进行计数排序 \(利用计数排序适用于小范围数的特点\)
/*** 基数排序适用于:*  (1)数据范围较小,建议在小于1000*  (2)每个数值都要大于等于0* @param  arr 待排序数组* @param  maxDigit 最大位数*/
//LSD Radix Sortfunction radixSort(arr, maxDigit) {var mod = 10;var dev = 1;var counter = [];for (var i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {for(var j = 0; j < arr.length; j++) {var bucket = parseInt((arr[j] % mod) / dev);if(counter[bucket]== null) {counter[bucket] = [];}counter[bucket].push(arr[j]);}var pos = 0;for(var j = 0; j < counter.length; j++) {var value = null;if(counter[j]!=null) {while ((value = counter[j].shift()) != null) {arr[pos++] = value;}}}}return arr;
}

基数
11.sort()
function compare(a,b){return a - b ;}//b-a 从大到下,对于数值类型或者valueOf()返回数值类型的得对象类型 function compare(a,b){ if( a > b){ return 1; }else if (a < b) { return -1; }else { return 0; } } var B =['a','b','c','ac','abc','ca','ba'];*/ B.sort(); console.log(B); //[ 'aa', 'abc', 'ac', 'b', 'ba', 'c', 'ca' ] var C = ['1','10','2','3','13','31','21']; C.sort(function(a,b){return a-b;}); console.log(C);
参考


http://chatgpt.dhexx.cn/article/l27pjjcW.shtml

相关文章

常见的10种算法

常见的10种算法 数据结构研究的内容&#xff1a;就是如何按一定的逻辑结构&#xff0c;把数据组织起来&#xff0c;并选择适当的存储表示方法把逻辑结构组织好的数据存储到计算机的存储器里。 算法研究的目的是为了更有效的处理数据&#xff0c;提高数据运算效率。数据的运算是…

常用的10 种算法

译者&#xff1a;claudio jandan.net/2014/05/31/10-algorithms.html Reddit 有篇帖子介绍了算法对我们现在生活的重要性&#xff0c;以及哪些算法对现代文明所做贡献最大。如果对算法有所了解&#xff0c;读这篇文章时你可能会问 “作者知道算法为何物吗&#xff1f;”&#x…

常用的十种算法

十种算法 1、二分查找算法&#xff08;非递归&#xff09; 1、介绍&#xff1a; 1&#xff09;二分查找只适用于从有序的数列中进行查找&#xff08;比如数字和字母等&#xff09;&#xff0c;将数列排序后再进行查找 2&#xff09;二分查找算法的运行时间为对数时间O&…

基础夯实:基础数据结构与算法(二)

基础夯实&#xff1a;基础数据结构与算法&#xff08;二&#xff09; 常见的10种算法1、递归算法例题1&#xff1a;计算n&#xff01;例题2&#xff1a;斐波那契数列例题3&#xff1a;递归将整形数字转换为字符串例题4&#xff1a;汉诺塔例题5&#xff1a;猴子吃桃例题6&#x…

蓝桥杯知识点汇总:基础知识和常用算法

文章目录 JAVA基础语法&#xff1a;算法竞赛常用的JAVA API&#xff1a;算法和数据结构简单算法简单数据结构图论数学贪心动态规划 补充省赛题解待更&#xff1a; 此系列包含蓝桥杯&#xff08;软件类&#xff09;所考察的绝大部分知识点。一共分为 基础语法&#xff0c; 常用…

HBA的WWN号以及存储区域网络

古驰古驰巴拉巴拉&#xff0c;今天讲一下存储区域网络和wwn号以及查看wwn号的方法 存储区域网络&#xff08;Storage Area Network&#xff0c;简称SAN&#xff09;采用网状通道&#xff08;Fibre Channel &#xff0c;简称FC&#xff0c;区别与Fiber Channel光纤通道&#xf…

nsw hnsw

参考了很多该博客 https://blog.csdn.net/u011233351/article/details/85116719&#xff0c;感谢博主。 参考论文《Approximate nearest neighbor algorithm based on navigable small world graphs》 《Efficient and robust approximate nearest neighbor search using Hie…

思科光交MDS9710绑定WWN并激活新的wwn

第一步、查看所有的wwn号 #命令 #show flogi database 内容示例&#xff1a; 第二步、查看是否有发现新的wwn号 图中为新发现的wwn号 第三步、将该wwn号加入到对应的zone下 #先筋肉config模式 #再进入对应的zone zone name Zone_P11_****——** vsan 1 #新增新存在的wwn号…

www.wwwwwwwwww

复习题 一、问答题 1.Anaconda的优点有哪些&#xff1f; &#xff08;1&#xff09;开源。 &#xff08;2&#xff09;安装过程简单。 &#xff08;3&#xff09;⾼性能使⽤Python和R语⾔。 &#xff08;4&#xff09;免费的社区⽀持。 &#xff08;5&#xff09; Conda包…

NWD(2022)

A Normalized Gaussian Wasserstein Distance for Tiny Object Detection Abstract 检测微小物体是一个非常具有挑战性的问题&#xff0c;因为微小物体仅包含几个像素大小。我们证明&#xff0c;由于缺乏外观信息&#xff0c;最先进的检测器无法在微小物体上产生令人满意的结…

SAN环境中WWN,WWNN,WWPN的区别

存储区域网络&#xff08;Storage Area Network&#xff0c;简称SAN&#xff09;采用网状通道&#xff08;Fibre Channel &#xff0c;简称FC&#xff0c;区别与Fiber Channel光纤通道&#xff09;技术&#xff0c;通过FC交换机连接存储阵列和服务器主机&#xff0c;建立专用于…

WWN,WWNN,WWPN介绍

WWN是HBA卡用的编号吧&#xff0c;每一个光纤通道设备都有一个唯一的标识&#xff0c;称为WWN&#xff08;world wide name&#xff09;&#xff0c;由IEEE负责分配。在有多台主机使用磁盘阵列时&#xff0c;通过WWN号来确定哪台主机正在使用指定的LUN&#xff08;或者说是逻辑…

WWN,WWNN,WWPN区别

WWN: world wide number 是硬件的全球唯一标示 WWPN: world wide port number 是指端口号 WWNN: world wide node number 是指节点号 如果是光纤交换机的话wwn和wwnn是一样的,而wwpn是指每个光纤端口. 如果是HBA卡的话,若是只有一个端口则三者可能一样,若是有多个端口则和交换…

如何查看WWN号

如何查看WWN号 WWN即World Wide Name,用来标识网络上的一个连接或连接集合,主要用于FC和SAS。就像网卡的MAC地址一样,WWN是用在光纤网络的。 如何查看WWN号AIX: 1,获得AIX主机连接的光纤设备: # lsdev -Cc adapter -S a | grep fcs fcs0 Ava…

linux查看WWN号及常见问题解决

linux查看WWN号及常见问题解决 查看WWN号查看WWID号查询常见问题 查看WWN号 要查看CentOS 6.7版本的WWN号&#xff0c;可以执行以下步骤&#xff1a; 1.确保已经连接了存储设备。 lspci | grep -i fibre2.在终端中输入命令&#xff1a;lsscsi&#xff0c;然后按 Enter 键。该命…

WWN,WWNN,WWPN三者的区别

WWN: world wide number 是硬件的全球唯一标示 WWPN: world wide port number 是指端口号 WWNN: world wide node number 是指节点号 如果是光纤交换机的话wwn和wwnn是一样的,而wwpn是指每个光纤端口. 如果是HBA卡的话,若是只有一个端口则三者可能一样,若是有多个端口则和交换…

excel制作可模糊匹配的下拉框

1.整体效果&#xff1a; 2.设置数据有效性 在来源中输入公式&#xff1a;OFFSET(国籍地区!$A$1,MATCH(船舶基本资料!$F2&"*",国籍地区!$A$2:$A$246,0),,COUNTIF(国籍地区!$A$2:$A$246,船舶基本资料!$F2&"*"),) 其中“国籍地区”为一个sheet,ru如下…

关于Excel表操作-通过gensim实现模糊匹配

gensim是一个Python的自然语言处理库&#xff0c;能够将文档根据TF-IDF&#xff0c;LDA&#xff0c;LSI等模型转换成向量模式&#xff0c;此外&#xff0c;gensim还实现了word2vec&#xff0c;能够将单词转换为词向量。 gensim的一些常见概念&#xff1a; 语料Corpus: 一组原始…

Excel效率提升|解决不完全匹配数据整理

以各地级市&#xff08;1&#xff0d;5线城市&#xff09;人均GDP数据为例 从国家统计局或wind导出来的数据&#xff1a; 而我们整理后的目标sheet的匹配字段如图&#xff1a; 如何进行有效匹配&#xff1f; 观察可知&#xff1a;我们需要以城市名作为匹配的依据 如何将城市名批…

ExcelWPS通配符的使用方法,一招解决模糊查询!

大家好&#xff0c;本期和大家分享Excel通配符的使用方法&#xff01; Excel 通配符一共有3个。 它们的含义如下图所示&#xff1a; 符号含义举例&#xff1f;表示任意单个字符比如要查找所有姓王的名字为2个字的人&#xff0c;则可以使用 【 王? 】 代替&#xff1b;查找所…