问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JS常用的排序算法有哪些,如何实现这些算法

发布网友 发布时间:2022-04-26 22:49

我来回答

2个回答

懂视网 时间:2022-05-14 15:55

归并排序是一种分治算法。其思想是将原始数组切分成较小的数组,直到每个小数组只有一 个位置,接着将小数组归并成较大的数组,直到最后只有一个排序完毕的大数组。因此需要用到递归

核心:归并排序,拆分成左右两块数组,分别排序后合并

动图:

4.gif

注意:递归中最小的左右数组比较为单个元素的数组,因此在较上层多个元素对比时,左右两个数组一定是顺序的

代码:

function mergeSort(arr) {
 const len = arr.length;

 if (len < 2) return arr; // 递归的终止条件
 const middle = Math.floor(len / 2); // 拆分左右数组
 const left = arr.slice(0, middle);
 const right = arr.slice(middle);
 
 return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right) { // 将左右两侧比较后进行合并
 const ret = [];

 while (left.length && right.length) {
 if (left[0] > right[0]) {
 ret.push(right.shift());
 } else {
 ret.push(left.shift());
 }
 }

 while (left.length) {
 ret.push(left.shift());
 }
 while (right.length) {
 ret.push(right.shift());
 }

 return ret;
}

2.5 快速排序

快速排序也许是最常用的排序算法了。它的复杂度为O(nlogn),且它的性能通常比其他的复 杂度为O(nlogn)的排序算法要好。和归并排序一样,快速排序也使用分治的方法,将原始数组分为较小的数组

核心:分治算法,以参考值为界限,将比它小的和大的值拆开

动图:

5.gif

注意:每一次遍历筛选出比基准点小的值

代码:

function quickSort(arr, left = 0, right = arr.length - 1) {
 // left和right默认为数组首尾
 if (left < right) {
 let partitionIndex = partition(arr, left, right);
 quickSort(arr, left, partitionIndex - 1);
 quickSort(arr, partitionIndex + 1, right);
 }
 return arr;
}

function partition(arr, left, right) {
 let pivot = left;
 let index = left + 1; // 满足比较条件的依次放在分割点后

 for (let i = index; i <= right; i += 1) {
 if (arr[i] < arr[pivot]) {
 swap(arr, i, index);
 index += 1;
 }
 }
 swap(arr, index - 1, pivot); // 交换顺序时,以最后一位替换分隔项
 return index - 1;
}

三、搜索算法

3.1 顺序搜索

顺序或线性搜索是最基本的搜索算法。它的机制是,将每一个数据结构中的元素和我们要找的元素做比较。顺序搜索是最低效的一种搜索算法。

function findItem(item, arr) {
 for (let i = 0; i < arr.length; i += 1) {
 if (item === arr[i]) {
 return i;
 }
 }
 return -1;
}

3.2 二分搜索

二分搜索要求被搜索的数据结构已排序。以下是该算法遵循的步骤:

  1. 选择数组的中间值
  2. 如果选中值是待搜索值,那么算法执行完毕
  3. 如果待搜索值比选中值要小,则返回步骤1在选中值左边的子数组中寻找
  4. 如果待搜索值比选中值要大,则返回步骤1在选中值右边的子数组中寻找
function binarySearch(item, arr) {
 arr = quickSort(arr); // 排序

 let low = 0;
 let high = arr.length - 1;
 let mid;

 while (low <= high) {
 min = Math.floor((low + high) / 2);
 if (arr[mid] < item) {
 low = mid + 1;
 } else if (arr[mid] > item) {
 high = mid - 1;
 } else {
 return mid;
 }
 }
 return -1;
}

四、算法复杂度

4.1 理解大O表示法

大O表示法用于描述算法的性能和复杂程度。分析算法时,时常遇到一下几类函数

2.png

(1)O(1)

function increment(num){
 return ++num;
}

执行时间和参数无关。因此说,上述函数的复杂度是O(1)(常数)

(2)O(n)

顺序搜索函数为例,查找元素需要遍历整个数组,直到找到该元素停止。函数执行的总开销取决于数组元素的个数(数组大小),而且也和搜索的值有关。但是函数复杂度取决于最坏的情况:如果数组大小是10,开销就是10;如果数组大小是1000,开销就是1000。这种函数的时间复杂度是O(n),n是(输入)数组的大小

(3)O(n2)

冒泡排序为例,在未优化的情况下,每次排序均需进行n*n次执行。时间复杂度为O(n2)

时间复杂度O(n)的代码只有一层循环,而O(n2)的代码有双层嵌套循环。如 果算法有三层遍历数组的嵌套循环,它的时间复杂度很可能就是O(n3)

4.2 时间复杂度比较

(1)常用数据结构时间复杂度

3.png

(2)排序算法时间复杂度

4.png

相关视频教程推荐:《JavaScript教程》

热心网友 时间:2022-05-14 13:03

1.冒泡排序
var bubbleSort = function (arr) {
var flag = true;
var len = arr.length;
for (var i = 0; i < len - 1; i++) {
flag = true;
for (var j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
flag = false;
}
}
if (flag) {
break;
}
}
};
2.选择排序
var selectSort = function (arr) {
var min;
for (var i = 0; i < arr.length-1; i++) {
min = i;
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
茶映人生:苦尽甘来 海尔冰箱冷藏室和冷冻室都是空空的通上电工作会更耗电吗? 上菱冰箱用过7年了,1米5高有点大,我每天冰箱里面只冻半斤肉,冷藏室其它... 结婚前个人的保险结婚后转成存单是属于个人财产还是夫妻双方的财产_百 ... 六个月宝宝大便水样蛋花怎么办 宝宝拉蛋花样便怎么办 ...张仙亲送玉麒麟,一家老少皆欢喜,祖德宗功信可凭。 我见青山多妩媚,料青山见我应如是意思 料青山见我应如是的意思_百度知... 电脑导航用哪个比较好电脑用什么网址导航哪个更好用 电脑看地图哪个好电脑上的哪个地图软件好 民情日记走访记录怎么写? 儿童主任走访记录怎么写 民情日记走访记录怎么写 客户经理如何写好走访日记 走访纪录怎么写 怎么写走访日记 雷克萨斯进口有多少款车型? 雷克萨斯哪国车 雷克萨斯油电混合动力有哪几款 雷克萨斯最便宜的车排行榜有哪些推荐? 雷克萨斯最好的轿车车型是哪款? 雷克萨斯有几种车型? 雷克萨斯ES同等级车是哪几款? 雷克萨斯有多少款车型? 你觉得雷克萨斯哪款车比较适合入手呢? 冰箱一直响还有两边温度高怎么回事? 冰箱有放鞭炮的一声爆响,什么原因? 丁香通的网站简介 丁香花可以干什么 如何分辨丁香花? 群众工作走访日志怎么写? 走访重点大学学生日记 用JS实现排序的功能 儿童主任日常走访困境儿童日志怎么写 js 按名称排序 js几种常见排序的实现 js数值的排序 用JS实现对每一项为数值的数组进行排序 js sort方法是什么排序 纯镍的晶面间距是多少 什么样的面料才能叫速干面料? 速干面料的成分是什么呀? 微信怎么查以前绑定的银行卡但是现在已经退出来了 速干衣面料有哪几种?具体品种的名称!!!谢谢 速干衣面料哪种材质好? 速干衣面料哪种材质好? 被封,忘了之前绑定的哪张银行卡了,如何查到? 速干面料的介绍 win10怎么在电脑桌面上添加便签? 秋葵炒鸡蛋,秋葵炒鸡蛋的做法,秋葵炒鸡蛋怎么做