JavaScript 实现冒泡排序、快速排序和插入排序

对于JavaScript 实现冒泡排序、快速排序和插入排序,很多网友还不是很明白,今天艾巴小编收集了这方面的知识,就将其分享出来。
操作方法:
01var a=[12,3,43,11,56,90,7,66,82];以上面的数组a为例,进行升序排序。在第一轮循环中,我们要从数组中找到数值最大的数字,并将其放在数组的末尾,即索引为a.length-1。即从a[0]开始,依次比较相邻两个数的大小。首先是比较a[0]和a[1]。如果a[0]a[1],则交换两个数字的位置。否则,两个数字的位置不会交换。 a[0]是12,a[1]是3,所以位置必须交换。交换位置后,数组为[3,12,43,11,56,90,7,66,82],然后比较a[1]和a[2],(a[1]=12)( a[2]=43),不需要交换位置,类似后面比较a[2]和a[3],(a[2]=43) (a[3]=11),交换位置,此时数组a为[3,12,11,43,56,90,7,66,82],以此类推,如果a[j]a[j+1]交换值,否则继续。
02 注意:要在两个变量之间交换数据,通常需要一个中间变量。例如:var a='a',b='b';为了允许a和b交换值,需要一个中间变量:var temp=a;a=b;b=temp;这样第一轮外循环完成后,我们得到的数组a就是[3,12,11,43,56,7,66,82,90],最大的值90放在最后数组的。在第二个外循环中,我们只需要与a.length-2的位置进行比较,因为最后一项a[a.length-1]已经确定(90)。在第三个外循环中,我们需要与a.length-3的位置进行比较,因此内循环中j的值为j a.length-1-i。通过两次循环,就完成了冒泡排序。
03function bubbleSort(arr){ var n=arr.length; //获取数组的长度,即排序中有n个数var temp=null; //定义一个临时变量,用for(var i=0; in交换数据-1; i++){ //外层循环n-1次for(var j=0; jn-1-i; j++ ){ //内层每次循环n-1-i次,每次循环完成。可以从剩下的数中找到最大的一个,放在n-1-i的位置if(arr[j]arr[j+1]){ //If a[j]a[j+1] then交换位置temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=临时;返回arr; //返回排序后的数组}
04 冒泡排序优化: function bubbleSort(arr){ var n=arr.length; var 临时=空; var flag=false;//设置标志位,初始值为false for(var i=0; in-1; i++){ for(var j=0; jn-1-i; j++){ if(arr [j]arr[j+1]){ temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=临时; flag=true;//只要flag交换了,就设置为true } } if(flag){//只要位置交换了,flag值就重置为false flag=false ; }else{//如果没有交换,则说明数组已经排序完毕,可以结束循环break;返回arr; }
05 快速排序的基本思想:首先从数组a中选择一个参考点(通常我们以中间的项作为参考点),然后遍历数组,将比参考点小的项放入左边集合a中参考点,并将大于参考点的物品放在参考点的右侧进行组装。对左右集合重复上一操作,直到每个子集中只剩下一个元素。其实就是一个递归的思想。仍然以数组a=[12,3,43,11,56,90,7,66,82]为例,我们首先选择一个参考点pivot=a[Math.floor(a.length/2)] ,即a[4]的值为56,那么方便数组中剩余的项,将小于56的数组项放在左数组左边,大于等于56的数组项放在右数组正确的。第一轮操作结束后,left=[12,3,43,11,7],right=[90,66,82],然后左右重复上述操作,直到只剩下一项或为空左和右。最后返回左+枢+右。
06function fastSort(arr){ var len=arr.length;//获取arr的长度if(len=1){//如果arr的长度小于等于1,则直接返回arr return arr; } var pIndex=Math.floor( len/2);//获取枢轴点的索引下标var hub=arr.splice(pIndex,1);//使用splice 方法获取枢轴点ivot=[arr [pIndex]],此时arr就是去掉第一个pIndex项之后的剩余项; var 左=[]; var 右=[]; for(var i=0; iarr.length; i++){ if(arr[i]pivot[0]){//如果小于基数的点放入数组l left.push(arr[i]) ; }else{//如果大于等于参考点,则将该点放入右数组right.push(arr[i]); } } return fastSort(left) .concat(pivot,quickSort(right));//递归重复整个过程
07 插入排序的基本思想:首先选择数组的第一项,即a[0]。我们可以认为这个数字已经排序了,然后取出a[1]项并将其插入到已排序的元素中。这里只有a[0],所以我们需要比较a[1]和a[0]的大小。如果a[1]a[0],需要先用临时变量temp保存a[1],将a[0]后移一位(即a[1]的位置),然后赋值temp到[0]。要插入的元素依次为a[1]-a[a.length-1]项。插入每一项时,需要从后向前遍历已排序的元素。如果已排序的元素大于插入的元素,则将元素向后移动一位,直到已排序的元素小于等于要插入的元素(或者已排序的数组项已遍历完),然后将要插入到索引+1 处(或数组的位置0 处)的元素。对每个插入的项执行上述操作,最终的数组就会排序。
08function insertSort(arr){ var temp=null;//定义一个临时变量,保存要插入的元素的值for(var i=1; iarr.length; i++){//从索引位置开始遍历数组1 if(arr[ i]arr[i-1]){//只有当要插入的元素小于已排序的最大元素时,才需要进行如下操作temp=arr[i];//赋值要插入临时变量的元素var p=i-1;//排序数组的最后一项索引是i-1 while(temparr[p] p=0){//如果要插入的元素是小于已排序的元素尚未到达已排序数组的开头arr[p+1]=arr[p];//将大于待插入元素(temp)的已排序元素位置向后移一位位置p --;//方便从后向前排序元素} arr[p+1]=temp;//将要插入的元素插入已排序数组中,索引位置为p+1 } } return arr; //返回排序后的数组}
以上知识分享到此为止,希望能够帮助到大家!
推荐阅读
- alfa romeo车标含义?(阿尔法罗密欧车标)
- 华为鸿蒙os如何操作 华为鸿蒙os2.0系统官网报名入口
- 14款沃尔沃s60l二手车能买吗?(沃尔沃s60为什么贬值厉害)
- power mp3 wma converter(mp3格式转换器)软件介绍(power mp3 wma converter(mp3格式转换器))
- 42岁李贞贤宣布平安生女,网友:歌声击退山贼的那个
- 热火朝天的高铁WiFi迟迟未到(5G能否破局)
- 华为手机性价比最高是哪几款2022? 华为哪款手机性价比高最值得入手
- 进口捷豹全部车型报价?(捷豹报价大全价格表)
- 韩庚江铠同疑相恋,两人同游马尔代夫遭曝光
- 八卦格字帖软件介绍(八卦格字帖)
- 虚拟机 操作系统(操作系统整合:虚拟机管理程序的下一步)
- 比亚迪f6参数配置?(比亚迪f6)
- 奥沙利文获世锦冠军,奥沙利文得了几次世锦赛冠军
- Evel Knievel手游游戏介绍(Evel Knievel手游)
- 索尼wi1000x拆解(SONYNZW-X1000系列高清拆解图集)
- 4座硬顶敞篷跑车都有哪几款?(4门4座硬顶敞篷车推荐)
- 艺术体操团体全能决赛,艺术体操团体全能决赛中国
- 工人物语6通用修改器游戏介绍(工人物语6通用修改器)
- 简述电机换向器的工作原理图(简述电机换向器的工作原理)
- Atheros-AR5007EG无线网卡驱动软件介绍(Atheros-AR5007EG无线网卡驱动)
