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; //返回排序后的数组}
以上知识分享到此为止,希望能够帮助到大家!
推荐阅读
- 优酷下载电视剧到u盘,如何下载电视剧到u盘
- 五年跑了八万公里的车还可以买吗?(5万一8万买什么车最好)
- win10 2004什么时候发布,win10 2004发布时间:微软确认了Windows10 2004 更新推迟
- 小米12月新品发布会内容?(小米发布会最新消息)
- 二手房交易土地出让金怎么算,土地出让金怎么算
- 冬至的习俗文章,冬至的习俗有哪些
- win7cmd命令大全,.cmd命令大全
- 七夕女朋友表白语句?(七夕语录送女朋友)
- 小米12 ultra目前还值得入手吗?(小米12ultra)
- 本田皓影低配和高配的区别?(本田皓影)
- i7电脑配置清单及价格,高性能i7电脑配置清单推荐i7台式机配置清单
- 成人用品,女性自慰用品振动棒
- 怎么查看qq登陆记录2020,怎么查看qq登陆记录
- 骁龙666是什么级别?(骁龙处理器发布会)
- 如何更换搜狗浏览器白色背景,搜狗浏览器怎样更换皮肤
- 大米生小黑虫怎么办该怎么处理,大米生虫怎么办教你怎样解决大米生虫问题
- 宝马s1000rr落地价?(宝马1系多少钱一辆)
- 陶瓷天线周围需要注意什么,陶瓷天线是什么陶瓷天线概述
- 手机版qq空间花藤怎么设置,手机qq空间花藤设置方法