1.冒泡排序
外层循环控制坑位,内层循环控制找到合适的数,两者循环方向相反。
function bubbleSort(arr){ for(var outer=arr.length-1;outer>0;outer--){ //每次循环填好一个坑;剩最后一个数时(下标为0)不用比较 for(var inner=0;inner<outer;inner++){ //找到合适的一个数,前后两个数比较;后面排好了的坑位不用循环 if(arr[inner]>arr[inner+1]){ //是否交换 var temp=arr[inner]; arr[inner]=arr[inner+1]; arr[inner+1]=temp; } } } }
2.选择排序
查找过程和冒泡排序相同,但交换次数会更少,性能更高。内外层循环方向相同。
function selectionSort(arr){ for(var outer=0;outer<arr.length;outer++){ //外层循环控制坑位,每次填一个坑位 var tempPos=outer,temp; //通过内层循环找出当此循环的最小值;因为js变量作用域的原因,tempPos必须重新赋值 for(var inner=outer+1;inner<arr.length;inner++){ //内部循环下标从外部循环坑位的后一个位置开始 if(arr[inner]<arr[tempPos]){ //如果外循环的值大于内循环的值,说明有更小的值,就将该值的下标保存在临时变量中 tempPos=inner; } } if(tempPos!=outer){ //内层循环结束,两个下标不一致时,将坑内的值和最小值交换一次就够了 temp=arr[outer]; arr[outer]=arr[tempPos]; arr[tempPos]=temp; } } }
3.插入排序
将无序的部分循环插入到有序的序列中,效率在这3者中最高。
function insertionSort(arr){ for(var outer=1;outer<arr.length;outer++){ //每次排序一个元素 var inner=outer; var temp=arr[outer]; while(temp<arr[inner-1]){ //之前的元素已经排好序。通过比较大小找到当前元素的正确位置;当前元素较小则之前的元素往后移动一格,直到将要排序的元素大于其值;最后在正确的位置上赋值。 arr[inner]=arr[inner-1]; //较大数后移一位 inner--; } arr[inner]=temp; } }
4.快速排序
对于大数据集处理最快
function quickSort(arr){ if(arr.length==0){ //递归结束条件 return []; } var left=[], right=[], devider=arr[0]; for(var i=1;i<arr.length;i++){ //以devider为界分成2边 if(arr[i]<devider){
left.push(arr[i]) }else{ right.push(arr[i]) } } return quickSort(left).concat(devider,quickSort(right)); //递归调用继续一分为二排序 }