会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 6大排序算法!
当前位置:首页 >系统运维 >6大排序算法 正文

6大排序算法

时间:2025-11-05 01:49:19 来源:益强数据堂 作者:数据库 阅读:424次

 6中常见的大排排序算法有GIF动图,更加容易帮助你理解其中的序算排序思想。

6种排序如下👇

冒泡排序

计数排序

快速排序

归并排序

插入排序

选择排序

时间复杂度如下图👇

排序算法复杂度分析

冒泡排序以下动图GIF来自知乎 帅地

冒泡排序这个名字的大排由来是向泡泡一样浮起来,脑补一下,序算就是大排每次比较相邻的两个元素大小,然后慢慢漂浮起来,序算看思路吧。大排

「时间复杂度O(n*n)」

思路

1 比较相邻的序算元素,前者比后者大的大排话,两者交换位置。序算

2 对每一对相邻元素做相同操作,大排从开始第一对到最后一对,序算这样子最后的大排元素就是最大元素。

3 针对n个元素重复以上步骤,序算每次循环排除当前最后一个。大排

4 重复步骤1~3,直到排序完成。

代码实现

// 最外层循环控制的内容是循环次数 // 每一次比较的内容都是相邻两者之间的大小关系 let BubbleSort = function (arr, flag = 0) {     let len = arr.length     for (let i = 0; i < len - 1; i++) {         for (let j = 0; j < len - 1 - i; j++) {             if (arr[j] > arr[j + 1]) {                 [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]             }         }     }     return flag ? arr.reverse() : arr } let arr = [2, 9, 6, 7, 4, 3, 1, 7] console.log(BubbleSort(arr, 1)) 

计数排序从名称上就知道,它的云服务器提供商思想:就是把数组元素作为数组的下标,然后用一个临时数组统计该元素出现的次数。

数组的数据必须是整数,而且最大最小值相差的值不要过大,对于「数据是负数的话,我实现的方案对此有优化」。

「时间复杂度:O(n+k)」

思路1.计算出差值d,最小值小于0,加上本身add

2.创建统计数组并统计对应元素个数

3.统计数组做变形,后面的元素等于前面的元素之和,也就是排名数组

4.遍历原始数组,从统计数组中找到正确位置,输出到结果数组

动画

计数排序

代码实现// 计数排序 let countingSort = function(arr, flag = 0) {     let min = arr[0],         max = arr[0],         len = arr.length;     // 求最大最小值     for(let i = 0; i < len; i++) {         max = Math.max(arr[i], max)         min = Math.min(arr[i], min)     }     // 1.计算出差值d,最小值小于0,加上本身add     let d =  max - min,         add = min < 0 ? -min : 0;     //2.创建统计数组并统计对应元素个数         let countArray  = new Array(d+1+add).fill(0)     for(let i = 0; i < len; i++){         let demp = arr[i]- min + add         countArray[ demp ] += 1      }     //3.统计数组做变形,后面的元素等于前面的元素之和,也就是排名数组     let sum = 0;     // 这里需要遍历的是countArray数组长度     for(let i = 0; i < d+1+add; i++){         sum += countArray[i]         countArray[i] = sum;     }     let res = new Array(len)     //4.遍历原始数组,从统计数组中找到正确位置,输出到结果数组     for(let i = 0; i < len; i++){         let demp = arr[i] -min + add         res[ countArray[demp] -1 ] = arr[i]         countArray[demp] --;     }     return flag ? res.reverse() : res } let arr = [2, 9, 6, 7, 4, 3, 1, 7,0,-1,-2] console.log(countingSort(arr)) 

快速排序基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

「时间复杂度:O(nlogn)」

思路

选择数组中间数作为基数,企商汇并从数组中取出此基数

准备两个数组容器,遍历数组,逐个与基数比对,较小的放左边容器,较大的放右边容器;

递归处理两个容器的元素,并将处理后的数据与基数按大小合并成一个数组,返回。

动画

快速排序

let quickSort = function (arr) {     // 递归出口就是数组长度为1     if (arr.length <= 1) return arr     //获取中间值的索引,使用Math.floor向下取整;     let index = Math.floor(arr.length / 2)     // 使用splice截取中间值,第一个参数为截取的索引,第二个参数为截取的长度;     // 如果此处使用pivot=arr[index]; 那么将会出现无限递归的错误;     // splice影响原数组     let pivot = arr.splice(index, 1)[0],         left = [],         right = [];     console.log(pivot)     console.log(arr)     for (let i = 0; i < arr.length; i++) {         if (pivot > arr[i]) {             left.push(arr[i])         } else {             right.push(arr[i])         }     }     return quickSort(left).concat([pivot], quickSort(right)); } //let arr = [2, 9, 6, 7, 4, 3, 1, 7] // console.log(quickSort(arr)) 

归并排序

将两个有序数列合并成一个有序数列,我们称之为“归并”

基本思想与过程:先递归的分解数列,再合并数列(分治思想的典型应用)

「时间复杂度: O(nlog(n))」

思路

将一个数组拆成A、B两个小组,两个小组继续拆,直到每个小组只有一个元素为止。

按照拆分过程逐步合并小组,由于各小组初始只有一个元素,可以看做小组内部是有序的,合并小组可以被看做是WordPress模板合并两个有序数组的过程。

对左右两个小数列重复第二步,直至各区间只有1个数。

动画

归并排序

代码实现const merge = (left, right) => { // 合并数组     let result = []     // 使用shift()方法偷个懒,删除第一个元素,并且返回该值     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 } let mergeSort = function (arr) {     if (arr.length <= 1)         return arr     let mid = Math.floor(arr.length / 2)     // 拆分数组     let left = arr.slice(0, mid),         right = arr.slice(mid);     let mergeLeftArray = mergeSort(left),         mergeRightArray = mergeSort(right)     return merge(mergeLeftArray, mergeRightArray) } let arr = [2, 9, 6, 7, 4, 3, 1, 7, 0, -1, -2] console.log(mergeSort(arr)) 

插入排序顾名思义:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

「时间复杂度: O(n*n)」

思路

从第一个元素开始,该元素可以认为已经被排序;

取出下一个元素,在已经排序的元素序列中从后向前扫描;

如果该元素(已排序)大于新元素,将该元素移到下一位置;

重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

重复步骤2~5。

代码实现

let insertionSort = function (arr) {     let len = arr.length     for (let i = 0; i < len; i++) {         let preIndex = i - 1,             cur = arr[i];         while (preIndex >= 0 && arr[preIndex] > cur) {             arr[preIndex + 1] = arr[preIndex]             preIndex--;         }         arr[preIndex + 1] = cur     }     return arr } let arr = [2, 9, 6, 7, 4, 3, 1, 7, 0, -1, -2] console.log(insertionSort(arr)) 

选择排序思路:每一次从待排序的数组元素中选择最大(最小)的一个元素作为首元素,直到排完为止

「时间复杂度O(n*n)」

思路

1.有n个数,需要排序n-1次

2.第一次选择最小值,放在第一位

3.第二次选择最小值,放在第二位

4.…..重复该过程

5.第n-1次选择最小值,放在第n-1位

代码实现let selectSort = function (arr, flag = 0) {     let len = arr.length,         temp = 0;     // 一共需要排序len-1次     for (let i = 0; i < len - 1; i++) {         temp = i;         for (let j = i + 1; j < len; j++) {             if (arr[j] < arr[temp])                 temp = j;         }         // 每一趟保证第i位为最小值         if (temp !== i) {             [arr[i], arr[temp]] = [arr[temp], arr[i]]         }     }     return flag ? arr.reverse() : arr } let arr = [2, 9, 6, 7, 4, 3, 1, 7, 0, -1, -2] console.log(selectSort(arr, 1)) 

(责任编辑:系统运维)

最新内容
推荐内容
  • 如何以3分钟强制删除管理员权限文件(快速、高效、安全的解决办法)
  • 1,mp3播放安装gstreamer在终端输入 sudo apt-get install gstreamer0.10-fluendo-mp3安装之后mplayer正常播放mp3系统的Rhythmbox可以正常的添加文件和播放mp32,mp3乱码解决办法安装:apt-get install python-mutagen装完了以后用下面这个命令处理一下就可以了:mid3iconv -e gbk 文件名这个文件名可以直接把文件拖到终端里,可以同时拖多个文件。
  • 在LINUX中自带的中文输入法 一直不太友好,用的不够爽。最近SOGO开发出了UBUNTU下的SOGO,安装了下。SOGO的智能化  ,是目前用的最舒服的输入法。下面是个人详细的安装步骤以及遇到问题的解决方法。软件名称:搜狗输入法 for Linux 2.0.0.0066 中文官方安装版 32位软件大小:17.8MB更新时间:2015-10-19软件名称:搜狗输入法 for Linux 2.0.0.0066 中文官方安装版 64位软件大小:17.8MB更新时间:2015-10-191、可以使用本文上面提供的下载,也可以打开下图中的SOGO官网,下载搜狗输入法安装包sogou_pinyin_linux_1.1.0.0037_i386.deb ,注意选择32BIT系统的安装包。2、为什么选择32BIT,不选择64BIT的呢?因为我的UBUNTU2.04安装的是32BIT版本。那如何判断系统是32还是64呢?在终端下输入命令getconf LONG_BIT,可以获取当前系统BIT数[xxx@ ~]getconf LONG_BIT323、安装输入法DEB包前,需要升级系统的一些基本库4、执行安装命令[xxx@ ~]sudo dpkg -i sogou_pinyin_linux_1.1.0.0037_i386.deb 发现错误,提示/usr/lib/libfreetype.so.6不是软链接执行以下命令[xxx@ ~]sudo ln -sf /usr/lib/i386-linux-gnu/libfreetype.so.6 /usr/lib/libfreetype.so.6解决后再次执行安装DEB包命令[xxx@ ~]sudo dpkg -i sogou_pinyin_linux_1.1.0.0037_i386.deb这样就可以安装成功5、安装成功后,需要重启电脑,输入法会自动替换成SOGO,测试了下很爽,熟悉的WINDOW回来了,谢谢阅读,希望能帮到大家,请继续关注脚本之家,我们会努力分享更多优秀的文章。相关推荐:Ubuntu 14.10系统中IBUS 中文输入法安装的图文教程
  • ubuntu用户现在已经确切的了解到关于unity8集成到ubuntu桌面的相关计划。ubuntu桌面其实还并没有引起更多开发者的足够关注,不过现在这种状况正在得到更快的改变。Canonical的ubuntu桌面团队经理,Will Cooke,最近谈到了关于unity桌面的一些未来规划,以及未来几个ubuntu版本的计划。可能已经有许多ubuntu用户,已经发现,有越来越多的ubuntu开发者正在把他们的精力放在了ubuntu的移动端平台上,与此同时,关注桌 面端ubuntu的开发者要比平常少了不少。这或许是因为,大家都认为,来自ubuntu touch的大量改进和优化,形成的成果最终也会汇集到桌面端吧!其实吧,并不是所有的人都相信,现在在ubuntu touch上的桌面环境,会让未来的ubuntu桌面端一样变得更强大,而且,所说的未来其实也没多久远!事实上,要比大家想想的更为靠近!下一代Ubuntu LTS会默认采用unity8ubuntu的移动平台正在使用unity8 ,这货不同于当前桌面端使用的unity7,毕竟人家使用了很多期待中的有趣特性。ubuntu的开发人员几乎花费了超过2年的时间,就是为了能让 unity8能在ubuntu phone和ubuntu touch上完美运行,所以为了这样的目的,几乎付出了他们的所有努力。Canonical的新晋桌面团队经理,Will Cooke ,详细的解释unity8的发展蓝图,即将发布的ubuntu14.10的默认桌面依然会是unity7 ,unity8仅会以开发者预览版的形式作为一种可选项予以提供,ubuntu15.04仍然会将unity7作为默认桌面,不过unity8将作为可替 代选项予以提供,而将unity8作为默认桌面最有可能是在ubuntu15.10发行版中。Will说“可能”,是因为他不确定,在那之前,会不会发生一些不可预料的事情影响进度,ubuntu开发人员可能会准备好,也可能不会,所以看情况了。不过,可以确定的是,unity8一定会作为ubuntu16.04这个长期支持版的默认使用桌面。为什么ubuntu新桌面是如此特别?你可能会认为,unity8仅仅是一种桌面环境的升级罢了,而事实上,它远不只如此!由于unity8的构建方式,当开发者发布新的应用和更新,终端用户会更快速的收到相关的包版本,而不用再等待新版本的ubuntu来获取相关的重要应用或者二进制包!“通常来说,新版本的ubuntu发布,会伴随有新版本的相关应用更新,当然也必然包含有重要的安全更新和BUG修复,但是为了获得相关更新,你不 得不耐心的等待新版本的ubuntu的发布,以及相关应用的重大更新才可以。而新版本的unity8工作机制,保证了开发者将其应用更新实时推送到客户端 面前而不需要等待,毫无疑问,终端用户会因此而获益多多!”Will Cooke这样说。社区阻力依然存在对Canonical来说,unity8是一个重大的改变,也正是因为如此,从一开始,就感受到来自社区的巨大质疑和阻力,这也是众所周知的!幸运 的是,unity8项目从一开始还是被绝大多数人认可,当然了也有人认为unity7才是最棒的,而unity8是个失败品。这也是没办法的事了!Canonical如今提供了使用unity8的另一个镜像(点击浏览),我们称之为“NEXT”!这是一个live CD,能够展现大概的功能,不过这货是基于一个超大号的tablet!期待吧,愚蠢的地球人,希望明年有足够的时间让大家用上新版本的unity!谢谢阅读,希望能帮到大家,请继续关注脚本之家,我们会努力分享更多优秀的文章。
  • 电脑剪映成品教程(轻松学会电脑剪映,制作出令人惊艳的影片效果)
  • 电脑上不了,显示DNS错误的解决方法(快速修复DNS错误,让电脑恢复上网畅通)
热点内容